🥰

Snowflakeの新しいSQL:group by all

がく@ちゅらデータです。

Snowflake Summit 2023も今日で最終日、色々新機能がでましたね
激アツすぎて、情報量多すぎて、頭がキャパオーバーで大変なことになっていますU(笑

概要

さて、そんな中、しれっとこんな記事がでているのをTwitterで観測しました

https://www.linkedin.com/posts/hoffa_snowflakesummit-activity-7080236011028434946-fIeC/

※書いてるのは、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