【SQL】その分析、GROUP BY じゃなくて QUALIFY を使うといいかも!

【SQL】その分析、GROUP BY じゃなくて QUALIFY を使うといいかも!

どうも、hosigakiです!

今日は、QUALIFY句を使った分析時のテクニックをご紹介します!

GROUP BY 句を使って、こんな分析していませんか?(筆者の実体験)

user_namepurchase_itempurchased_at
太郎干し柿2022-1-1
太郎干し柿ジュース2022-1-3
ジム干し柿2022-1-3
ジム柿まんじゅう2022-1-4
よしお干し柿2022-1-4
よしお柿せんべい2022-1-6
purchasesテーブル

上のテーブルを使って、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_namepurchase_itempurchased_at
太郎干し柿2022-1-1
ジム干し柿2022-1-3
よしお干し柿2022-1-4
抽出結果。みんなはじめは「干し柿」を買っていることが分かる。

実は、上記は筆者が実業務でやってた書き方なのですが、改めてこちらのクエリを見てみると...

  • purchasesテーブルを二回も参照している点に無駄がある
  • クエリが長くて少し複雑

といった印象を受けますね(;^_^A

hosigaki

同じテーブルを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_namepurchase_itempurchased_at
太郎干し柿2022-1-1
ジム干し柿2022-1-3
よしお干し柿2022-1-4
先ほどと同じ抽出結果に。

QUALIFY句は使いこなせば本当に便利なので、ぜひこちら試してみてください!

最後まで読んでいただきありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-,