❄️
Snowflake で特定のカラム以外のすべてのカラムで集約したい
前提
下記のような 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