どうも、hosigakiです!
今日は、QUALIFY句を使った分析時のテクニックをご紹介します!
GROUP BY 句を使って、こんな分析していませんか?(筆者の実体験)
user_name | purchase_item | purchased_at |
---|---|---|
太郎 | 干し柿 | 2022-1-1 |
太郎 | 干し柿ジュース | 2022-1-3 |
ジム | 干し柿 | 2022-1-3 |
ジム | 柿まんじゅう | 2022-1-4 |
よしお | 干し柿 | 2022-1-4 |
よしお | 柿せんべい | 2022-1-6 |
上のテーブルを使って、user_nameごとに、初購入日に何を購入したのか を分析するとします。
この時、GROUP BY句を用いて、以下のクエリで抽出することが可能です。
WITH
first_p AS (
SELECT
user_name,
MIN(purchased_at) AS purchased_at /*user_nameグループごとの、初購入日を抽出*/
FROM
purchases
GROUP BY
user_name
)
SELECT
first_p.user_name,
p.purchase_item,
first_p.purchased_at
FROM
purchases p
INNER JOIN first_p
ON p.user_name = first_p.user_name
AND p.purchased_at = first_p.purchased_at
/*↑ purchasesテーブルを、各ユーザーの初購入日のレコードのみに絞る*/
user_name | purchase_item | purchased_at |
---|---|---|
太郎 | 干し柿 | 2022-1-1 |
ジム | 干し柿 | 2022-1-3 |
よしお | 干し柿 | 2022-1-4 |
実は、上記は筆者が実業務でやってた書き方なのですが、改めてこちらのクエリを見てみると...
- purchasesテーブルを二回も参照している点に無駄がある
- クエリが長くて少し複雑
といった印象を受けますね(;^_^A
同じテーブルを1回だけ参照しつつ、もっとシンプルに書くには、どうすればええんやろか...
QUALIFY句を使って、もっとスマートなクエリに!
先ほどのクエリですが、実はGROUP BY句ではなく、QUALIFY句を使うことで、もっとシンプルに書けるんです!
(QUALIFY句の使い方はこちらの記事で解説しています!)
以下、先ほどのクエリを修正したものになります。
SELECT
user_name,
purchase_item,
purchased_at
FROM
purchases
QUALIFY
purchased_at = MIN(purchased_at) OVER(PARTITION BY user_name)
/*↑ 各user_nameごとに最小のpurchased_atを含むレコードのみに絞る*/
user_name | purchase_item | purchased_at |
---|---|---|
太郎 | 干し柿 | 2022-1-1 |
ジム | 干し柿 | 2022-1-3 |
よしお | 干し柿 | 2022-1-4 |
QUALIFY句は使いこなせば本当に便利なので、ぜひこちら試してみてください!
最後まで読んでいただきありがとうございました!
また次の記事でお会いしましょう(^^)/