Snowflakeの新しいSQL:group by all
がく@ちゅらデータです。
Snowflake Summit 2023も今日で最終日、色々新機能がでましたね
激アツすぎて、情報量多すぎて、頭がキャパオーバーで大変なことになっていますU(笑
概要
さて、そんな中、しれっとこんな記事がでているのをTwitterで観測しました
※書いてるのは、Snowflakeでいっぱい記事を書いてらっしゃるフェリペさん
※Snowflake Summit 2023では、寸劇されてましたねw
SQLとして「GROUP BY ALL」という構文が使えるようになりました。
- 「GROUP BY」は、グループ化を行うための命令
- 種類(カラム)ごとに集計ができる
- 今まで、とあるカラムを使ってグループ化をするためには、指定しなければならなかった
- ALLを使うことによって、カラムを個別に記述する必要がなった
- めちゃ楽!!
今まで group by は、
- group by col_a, col_b, ...
- group by 1, 2, .....
みたいな記法を使っていました。
ここに、「group by all」って書き方がでてきました。
SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS を使って検証してみましょう
group by all の検証
group by col_name
select
o_orderdate as "対象日"
, sum(o_totalprice) as "売上"
from
snowflake_sample_data.tpch_sf1.orders
group by
o_orderdate
order by
o_orderdate desc
;
この場合、
「対象日」でグルーピング
「売上」は集計
となって集計できます。
selectの表示カラムに、カラムを追加(エラーになる)
ここに、
select
o_orderdate as "対象日"
, o_orderpriority -- 追加してみた
, sum(o_totalprice) as "売上"
from
snowflake_sample_data.tpch_sf1.orders
group by
o_orderdate
order by
o_orderdate desc
;
と「優先度」をついかしてみると・・・・
とエラーになりました
group by all を使ってみる 〜 グルーピング対象
「group by all」を使ってみましょう
select
o_orderdate as "対象日"
, o_orderpriority -- 追加してみた
, sum(o_totalprice) as "売上"
from
snowflake_sample_data.tpch_sf1.orders
group by
all
order by
o_orderdate desc
;
desc table orders;
とやるとエラーは起きず
と、
group by
o_orderdate
, o_orderpriority
と同じ結果がでました!
group by all を使ってみる 〜 集計関数で追加
select
o_orderdate as "対象日"
, min(o_orderpriority) as "優先度の最小値" -- 追加してみた
, sum(o_totalprice) as "売上"
from
snowflake_sample_data.tpch_sf1.orders
group by
-- o_orderdate
all
order by
o_orderdate desc
;
とすると
自由自在ですね
もし仮に、テーブルに all というカラムがあったら・・・?
create or replace table orders_add_all as
select
*
, 12345 as "ALL"
from
snowflake_sample_data.tpch_sf1.orders
;
なSQLを発行して、「ALL」というカラムをつけてみました
select
o_orderdate as "対象日"
, min(o_orderpriority) as "優先度の最小値" -- 追加してみた
, sum(o_totalprice) as "売上"
, sum(all) as "all"
from
orders_add_all
group by
-- o_orderdate
all
order by
o_orderdate desc
;
→「SQLコンパイルエラー:無効な関数「SUM」」
select
o_orderdate as "対象日"
, min(o_orderpriority) as "優先度の最小値" -- 追加してみた
, sum(o_totalprice) as "売上"
, ALL as "all"
from
orders_add_all
group by
-- o_orderdate
all
order by
o_orderdate desc
;
→ 「SQLコンパイルエラー:位置 6 の構文エラー行 6 、予期しない「ALL」。」
ALLは予約語なのであかん・・・・
select
o_orderdate as "対象日"
, min(o_orderpriority) as "優先度の最小値" -- 追加してみた
, sum(o_totalprice) as "売上"
, "ALL" as "all"
from
orders_add_all
group by
-- o_orderdate
all
order by
o_orderdate desc
;
select
o_orderdate as "対象日"
, min(o_orderpriority) as "優先度の最小値" -- 追加してみた
, sum(o_totalprice) as "売上"
, sum("ALL") as "all"
from
orders_add_all
group by
-- o_orderdate
all
order by
o_orderdate desc
;
"ALL"とくくればアクセスできますので、この様になりました
まとめ
「GROUP BY ALL」なんで今までなかったんでしょうね?
GROUP BYを使う際には、グルーピングするために、group byに追加するか
SUMで計算して集計する とか MIN などを使い一つだけ抜き出して、擬似的に結果に出すか・・・でした
出力項目に、あるカラムを追加したら、SQLコンパイルエラー(集計でもないし、group byに指定されていない)
そこが自動でできる
かゆいところに手が届くけど、めちゃ便利な機能ですね!
Discussion