非常に単純化された、いくつかのサンプルデータを含む表:
action_date account_id
1/1/2010 123
1/1/2010 123
1/1/2010 456
1/2/2010 123
1/3/2010 789
上記のデータについては、次のようなクエリが必要です。
action_date num_events num_unique_accounts num_unique_accounts_wtd
1/1/2010 3 2 2
1/2/2010 1 1 2
1/3/2010 1 1 3
ここでわかるように、num_unique_accounts_wtdは、一意の期間の一種のローリング終了日を示します...
最初は、フォームのクエリを考えるでしょう
WITH
events AS
(
SELECT
action_date
, COUNT(account_id) num_events
, COUNT(DISTINCT account_id) num_unique_accounts
FROM actions
GROUP BY action_date
)
SELECT
action_date
, num_events
, num_unique_accounts
, SUM(num_unique_accounts) OVER (PARTITION BY NEXT_DAY(action_date, 'Monday') - 7 ORDER BY action_date ASC) num_unique_accounts_wtd
FROM events
動作しますが、よく見ると、毎日num_unique_accountsが追加されます。クエリを実行すると、わかりやすくするために、2010年1月2日は、2+1のためにnum_unique_accounts_wtd=3になります。
何か案は?
編集:わかりやすくするために、データと出力の行をもう1つ追加しました