sqlの実行タイミングについて不明点がございます。まず
テーブルは以下のような設計となっております。
sql
1DROP TABLE IF EXISTS item_purchase_anlytics; 2create table item_purchase_anlytics( 3item_name char(16), 4item_category char(16), 5action_date date, 6place char(8), 7user_id char(8), 8price int 9); 10insert into item_purchase_anlytics values 11 ('サバ','food','2019-03-29','Store A','UID0001',280), 12 ('しょう油','food','2019-03-29','Store A','UID0001',280), 13 ('サバ','food','2019-03-30','Store A','UID0001',350), 14 ('サバ','food','2019-03-30','Store A','UID0001',350), 15 ('卵','food','2019-03-30','Store A','UID0001',200), 16 ('しょう油','food','2019-03-30','Store A','UID0001',200), 17 ('鶏肉','food','2019-04-01','Store A','UID0001',450), 18 ('卵','food','2019-04-04','Store A','UID0001',280), 19 ('卵','food','2019-04-06','Store A','UID0001',280), 20 ('卵','food','2019-04-09','Store A','UID0001',280), 21 ('サバ','food','2019-04-10','Store A','UID0004',280), 22 ('しょう油','food','2019-04-10','Store A','UID0001',280), 23 ('卵','food','2019-04-10','Store A','UID0001',280), 24 ('卵','food','2019-04-12','Store A','UID0001',280), 25 ('卵','food','2019-04-12','Store A','UID0001',280), 26 ('鶏肉','food','2019-04-12','Store A','UID0001',450), 27 ('サバ','food','2019-04-13','Store A','UID0001',280), 28 ('しょう油','food','2019-04-13','Store A','UID0001',280), 29 ('深皿','zakka','2019-04-14','Store A','UID0003',780), 30 ('しょう油','food','2019-04-14','Store A','UID0003',280), 31 ('深皿','zakka','2019-04-14','Store A','UID0003',980), 32 ('卵','food','2019-04-15','Store A','UID0001',280), 33 ('サバ','food','2019-04-17','Store A','UID0001',280), 34 ('サバ','food','2019-04-18','Store A','UID0001',280), 35 ('深皿','zakka','2019-04-23','Store A','UID0002',980);
実行したsqlは以下になります。
sql
1 2以下のようなsqlを実行しました。 3 4SELECT 5 action_date, 6 SUM(price) AS amount_price, -- ① 7 AVG(SUM(price)) OVER( -- ② 8 ORDER BY 9 action_date 10 ROWS BETWEEN 6 preceding 11 AND CURRENT ROW 12 ) AS moving_average 13FROM 14 item_purchase_anlytics 15GROUP BY 16 action_date 17ORDER BY 18 action_date 19;
実行結果を確認したところ
①についてはGROUP BYしたグループごとに合計値を取得しているようなのですが
問題は②についてです。
通常ウインドウ関数についてはselect時に実行するつまり今回で言うとところのGROUP BYした後の最後のselect文の実行時に実行されるという認識です。
よって②のSUM(price)はGROUP BY action_dateでグループした後のacton_dateごとでグループした後の範囲の中での合計値を取得していると思います。
「AVG(SUM(price)) OVER(・・・」については実行結果を確認するとaction_dateを並べ変えてかつその合計値つまり①の実行結果を
出力した後のある行の6行前の平均値を取得しているように見えます。
ウィンドウ関数の実行タイミングはsqlのウインドウ関数以外のselect文が実行された後のデータに対してウインドウ関数が実行されるという認識で正しいでしょうか?
実行タイミングが読めないでウインドウ関数の実行タイミングがよくわからないのでどなたか教えていただきたいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/24 06:28
2021/08/24 07:06