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;