Azureリレーショナル定義問題

Azure SQL Databaseのクエリで「各顧客の過去12ヶ月の注文を直近3ヶ月分ずつローリング集計したい」という要件があります。ウィンドウ関数のどの構文を使うか?

A.GROUP BY(月別にグループ化して集計する)
✗ GROUP BYは行をグループ化するが、各行ごとのローリング集計(ウィンドウ)を計算できない。
B.ウィンドウ関数(PARTITION BY + ORDER BY + ROWS BETWEEN)← 正解
✓ 正解。ウィンドウ関数のPARTITION BY(顧客単位でパーティション)+ORDER BY(日付順)+ROWS BETWEEN(直近3行)の組み合わせで各行ごとのローリング集計が実現できる。
C.HAVING(グループ後のフィルタ条件で件数を絞る)
✗ HAVINGはGROUP BY後のフィルタ条件。ローリング集計の計算方法ではない。
D.CROSS JOIN(自己結合してサブクエリで直近件数を絞る)
✗ CROSS JOINで自己結合することで実現は可能だが、パフォーマンスが非常に悪く現代的なSQLではウィンドウ関数を使う。

DP-900:Microsoft Azure Data Fundamentals の問題一覧