SnowflakeのGROUP BYとウィンドウ関数の違い|集計の基本を初心者向けに解説

SnowflakeのGROUP BYとウィンドウ関数の違い|集計の基本を初心者向けに解説 Snowflake

はじめに:集計といえばGROUP BY、でもウィンドウ関数って?

こんにちは!SQLを書き始めると、最初に出会う集計の手段が GROUP BY ですよね。「合計を出す」「平均を出す」といった処理にとても便利です。でも、しばらく使っていると「行を残したまま集計値も並べたい…」という場面に出会います。そこで登場するのが ウィンドウ関数 です。 この記事では、SnowflakeにおけるGROUP BYとウィンドウ関数の違いを、SQL例を交えながら初心者向けにやさしく解説します。読み終えるころには「どっちを使えばいいの?」がスッキリ判断できるようになりますよ。
SnowflakeのGROUP BYとウィンドウ関数の違いを初心者向けに比較するアイキャッチビジュアル

GROUP BY:行をまとめて1行にする集計

GROUP BY は、指定したカラムの値ごとに行をグループ化し、1グループにつき1行に集約する仕組みです。たとえば「部署ごとの平均給与」を出すときに使います。
SELECT department,
       AVG(salary) AS avg_salary,
       COUNT(*)    AS member_count
FROM employees
GROUP BY department;
このクエリでは department ごとに行がまとまり、結果は部署の数だけになります。元の個別の行(誰がいくらもらっているか)は見えなくなるのがポイントです。

GROUP BYで気をつけたいこと

SELECT句に書けるのは、原則として「GROUP BYで指定した列」または「集計関数で包んだ列」だけです。employee_name をそのまま書くとエラーになります。これは SnowflakeのSELECT文入門 でも触れた、SQL基本ルールのひとつですね。

ウィンドウ関数:行を残したまま集計値を並べる

一方、ウィンドウ関数OVER (...) 句を伴う関数で、行を集約せずにそのまま残しつつ、各行の隣に集計結果を表示できる便利な仕組みです。
SELECT employee_name,
       department,
       salary,
       AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary,
       RANK()      OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
この例では、社員1人1人の行はそのまま残り、各行に「自分の部署の平均給与」と「部署内の給与順位」が並びます。GROUP BYでは絶対にできない芸当です!
ウィンドウ関数で社員ごとの行を残しつつ部署平均給与と順位を並べたSnowflakeのSQL結果テーブル

OVER句の中身を理解しよう

  • PARTITION BY:集計の単位(GROUP BYのグループに相当)
  • ORDER BY:行の順序を指定(RANKや累計に必要)
  • ROWS / RANGE:範囲を絞ることで「直近3行の移動平均」なども可能

使い分けのポイント

ざっくりとした判断基準は次の通りです。
  • 結果を集約したい(行数を減らす) → GROUP BY
  • 明細行を残したまま集計値を並べたい → ウィンドウ関数
  • ランキング、累計、移動平均、前後の行との比較 → ウィンドウ関数の独壇場
たとえばJOINと組み合わせて部署マスタや上司情報を引きながら集計したい場合は、SnowflakeのJOIN完全ガイド も併せて読むと理解が深まります。

よくあるユースケース

  • 売上ダッシュボード:GROUP BYで月次合計、ウィンドウ関数で前年同月比
  • ランキング画面:RANK()やROW_NUMBER()でTOP N抽出
  • KPI推移:SUM() OVER (ORDER BY date) で累積売上

まとめ

GROUP BYは「行をまとめる」集計、ウィンドウ関数は「行を残して横に集計値を並べる」集計です。両者は対立するものではなく、目的に応じて使い分けるパートナーのような存在。Snowflakeはどちらも高速に処理してくれるので、安心して使ってみてくださいね。

参考リンク

関連記事