しかし、時系列のデータにはギャップがある可能性があります。そのため、月ごとに確実に平均化するには、ギャップがないことを確認する必要があります。方法は(多くがあります)次のようなものを実行して、範囲が行として存在するようにしてから、それらにデータを結合します。私が特に注意するもう一つのことは、日付範囲の間に "between"を使用しないことです。以下に示すように>=
と<
を使用すると、誤って上境界日に座っているデータが数えきれないほど大きくなることはありません。
declare @start_dt date;
set @start_dt = '20170601';
select
u.driver, period_start_dt, period_end_dt
, count(completiondate) montly_count
, AVG(COUNT(completiondate))OVER() avg_montly_count
from (
select
dateadd(month,m.n,start_dt) period_start_dt
, dateadd(month,m.n+1,start_dt) period_end_dt
, m.n month_no
from (
select @start_dt start_dt) seed
cross join (select 0 n union all
select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9 union all
select 10 union all select 11
) m
) r
-- LEFT JOIN YOUR DATA
LEFT JOIN unloads u on u.completiondate >= r.period_start_dt and u.completiondate < r.period_end_dt
WHERE period_start_dt >= '20170601' and period_start_dt < '20171001'
group by
u.driver , period_start_dt, period_end_dt
order by
period_start_dt, u.driver
Demo
'SELECT AVG(...)'をラップするだけですか?この場合CTEを使用することができます(一般的な習慣の場合のみ、そうでない場合はネストされたSELECTはOKです)。 –
'AVG(COUNT(order_number))OVER()をavgtotal'として追加するだけで、出力をどのように見えるかに応じて動作するはずです。 – ZLK
これは本当に興味深い日付範囲です、それはmm-dd-yyyyかdd-mm-yyyですか?なぜ11日? (またはそれはちょうど数日です)あなたは4ヶ月を期待していますか?彼らはすべて11日に開始する予定ですか?期間は「間は悪い」と言います。 –