本サイトにはプロモーションが含まれています
使い方
SELECT
category,
item_id,
purchases
FROM
dataset.purchase
WHERE
true
QUALIFY RANK() OVER (PARTITION BY category ORDER BY purchases DESC) = 1
purchasesテーブル
| category | item_id | purchases |
|---|---|---|
| drama | D001 | 30 |
| drama | D002 | 5 |
| drama | D003 | 70 |
| action | A001 | 0 |
| action | A002 | 20 |
| action | A003 | 0 |
| anime | N001 | 80 |
| anime | N002 | 30 |
結果
| category | item_id | purchases |
|---|---|---|
| action | A002 | 20 |
| anime | N001 | 80 |
| drama | D003 | 70 |
解説
以下の手順で取得しています。
- categoryごとの購入数が高い順にランク付け
- ランク1位の商品を取得
従来のクエリと比較して、直感的に理解しやすくなりました。
ネストせずにWHERE句に近いところで条件指定できる、またwith句またはサブクエリなしで条件指定でき、クエリがスッキリした印象ですね。
WITH ranked_data AS (
SELECT
category,
item_id,
purchases,
RANK() OVER (PARTITION BY category ORDER BY purchases DESC) rn
FROM
dataset.purchase
)
SELECT
* EXCEPT (rn)
FROM
ranked_data
WHERE
rn = 1
SELECT
category,
item_id,
purchases
FROM
dataset.purchase
WHERE
true
QUALIFY RANK() OVER (PARTITION BY category ORDER BY purchases DESC) = 1
制限事項
QUALIFY 句には、少なくとも次の句の 1 つと組み合わせて使用する必要があります。
WHEREGROUP BYHAVING
WHERE true とすることでこの制限を抜けることができます。
プレビュー版のため改善される余地はあるかもしれませんね。(2021/06/27現在)
関連リンク
より実務的なクエリを身につけるには「ビッグデータ分析・活用のためのSQLレシピ」がおすすめ。
本サイトにはプロモーションが含まれています

