Snowflake QUALIFY句の使い方|ウィンドウ関数の絞り込みが超簡単に

Snowflake QUALIFY句の使い方|ウィンドウ関数の絞り込みが超簡単に Snowflake

はじめに:QUALIFY句って何ができるの?

SQLを書いていて、「ウィンドウ関数の結果で絞り込みたいのに、サブクエリを書かないといけなくて面倒…」と思ったことはありませんか?Snowflakeには、その悩みを一発で解決する QUALIFY句 という独自の機能があります。 QUALIFY句は、ウィンドウ関数(ROW_NUMBER()RANK()など)の結果に対してWHERE句のような絞り込みをかけられる句です。これを使うと、「グループごとに最新の1件だけ取得」「カテゴリ別ランキングのTOP3だけ取得」といった処理が驚くほどスッキリ書けます。 この記事では、データベース未経験〜SQL初級者の方に向けて、QUALIFY句の基本から実用的な使い方まで解説していきます!
Snowflake QUALIFY句を使えばサブクエリ不要でウィンドウ関数の結果を絞り込める利点を示すコンセプト図

QUALIFY句の基本:WHERE句との違い

SQLには既に WHEREHAVING という絞り込み専用の句があります。それぞれの役割を整理してみましょう。
  • WHERE:テーブルの行そのものを絞り込む(集計前)
  • HAVING:GROUP BYで集計した結果を絞り込む
  • QUALIFY:ウィンドウ関数の結果を絞り込む
つまり QUALIFY は「ウィンドウ関数版のHAVING」というイメージです。SnowflakeのGROUP BYとウィンドウ関数の違いを理解しておくと、QUALIFYの立ち位置がより明確になりますよ。

従来のSQL(QUALIFYなし)はどう書く?

例えば「ユーザーごとに最新の注文1件だけを取得したい」場合、QUALIFYがないとサブクエリでこう書く必要があります。
SELECT *
FROM (
  SELECT
    user_id,
    order_id,
    order_date,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) AS rn
  FROM orders
)
WHERE rn = 1;
ネストが入って、ちょっと読みにくいですよね…。

QUALIFYを使うとこんなにスッキリ!

SELECT
  user_id,
  order_id,
  order_date
FROM orders
QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) = 1;
サブクエリが消えて、たった1文で同じことができました!これがQUALIFY句の威力です。

具体的な使い方とユースケース

ユースケース1:カテゴリ別TOP3を取得

商品カテゴリごとに売上TOP3だけを抜き出したい、というよくある分析パターンです。
SELECT
  category,
  product_name,
  sales_amount
FROM products
QUALIFY RANK() OVER (PARTITION BY category ORDER BY sales_amount DESC) <= 3;

ユースケース2:重複データの除去

同じemailが複数行ある場合、最初に登録された1件だけ残すクエリです。
SELECT *
FROM users
QUALIFY ROW_NUMBER() OVER (PARTITION BY email ORDER BY created_at) = 1;

ユースケース3:前日比の計算結果で絞り込み

SELECT
  sales_date,
  daily_sales,
  LAG(daily_sales) OVER (ORDER BY sales_date) AS prev_sales
FROM daily_summary
QUALIFY daily_sales > LAG(daily_sales) OVER (ORDER BY sales_date) * 1.5;
「前日比1.5倍以上の急成長日」だけを取り出せます。
Snowflake QUALIFY句でROW_NUMBERやLAGを用い重複除去や急成長日抽出を行うSQLサンプルコード

QUALIFY使用時の注意点

  • ウィンドウ関数が必須:QUALIFYの条件式には、SELECTリストかQUALIFY句自体に必ずウィンドウ関数が含まれている必要があります。
  • 実行順序はSELECTの後:WHEREやGROUP BYで絞り込まれた後の行に対して、ウィンドウ関数とQUALIFYが評価されます。
  • エイリアスも使える:SELECT句でRANK() OVER(...) AS rnkと別名をつけ、QUALIFYでrnk <= 3と書くこともできます。
なお、QUALIFYはSnowflake独自の便利機能で、他のDB(MySQLなど)では使えないことが多いので移植時には注意してください。SnowflakeのSELECT文入門でも他DBとの違いに触れています。

まとめ

QUALIFY句を使えば、ウィンドウ関数の結果に対する絞り込みがサブクエリなしで書けて、SQLが圧倒的に読みやすくなります。「グループごとに最新1件」「TOP N抽出」「重複除去」など、データ分析の現場で頻出するパターンをシンプルに表現できる強力な味方です。 ぜひ Snowsight のワークシートで実際に試してみてください!一度使うと手放せなくなりますよ。

参考リンク

関連記事