❄️

Snowflake で特定のカラム以外のすべてのカラムで集約したい

2023/07/21に公開

前提

下記のような 100 カラムのテーブルがあるとします。

create or replace table very_wide_table(c1 int, c2 int, c3 int, ... c98 int, c99 int, c100 int) as
select random(),  random(),  random(),  random(), ...  random(),  random(),  random()
from table(generator(rowcount => 1000000));

これを c1 から c98 までの (c99 以外の) カラムで GROUP BY して sum(c100) を計算したいけど、GROUP BY c1, c2, c3, ... c97, c98 を書くのはさすがにめんどくさい場合、どうすればいいでしょうか。

解法: SELECT * EXCLUDE + GROUP BY ALL

select * exclude(c99, c100), sum(c100)
from very_wide_table
group by all
;
/*
C1	C2	C3	...	C97	C98	SUM(C100)
3413343475257059973	-5197990268186155800	7076325801460747895	...	-2005483420407999206	-2555280756467615551	6302861574497479970
...
*/

SELECT * EXCLUDE で、

  • 集約に使わないカラム (c99)
  • 集約関数の対象になるカラム (c100)

を式リストから除いてあげた状態で GROUP BY ALL すると、SELECT * EXCLUDE を反映した状態でのすべての非集約カラムが集約キーになるため、求めている動作が実現できます。

集約キーの数よりも非集約キー・集約対象カラムのほうが少ない場合に便利そうです。

Discussion