見出し画像

IT エンジニア日記 ~Prest DB で顧客ごとの商品ランキングを~ -2024/06/28-

どうも。 clown です。

みんなオラに元気をわけてくれ!
ってくらいに体調が悪くてしんどい。それでも仕事は休めない状況で、歯を食いしばって仕事してる。

Prest DB で顧客単位に購入数をランキングしたい。みたいなことをやらないといけなくなった。

顧客名 | 商品名1 | 商品1購入数 | 商品名2 | 商品2購入数 | 商品名3 | 商品3購入数
みたいなレコードを作りたい

まず、購入数をまとめる。

SELECT
    customer_id
  , COUNT(customer_id) as brought
  FROM
    order_table
GROUP BY
    item_id;

これをランキングにする。ここで、ROW_NUMBER 関数を使う手段はあるんだけど、全件に対してナンバリングするので、レコードが多くなればなるほど遅くなる。だから RANK 系の関数を使うのがポイント。

SELECT
    *
  , DENSE_RANK() OVER (PARTITION BY customer_table.customer ORDER BY brought_count.brought DESC) as rank
  FROM
    customer_table
    INNER JOIN (
        SELECT
            customer_id
          , COUNT(customer_id) as brought
          FROM
            order_table
        GROUP BY
            item_id
    ) as brought_count ON (customer_table.customer_id = brought_count.customer_id)

という感じ。
これを1位が欲しければ

SELECT
    *
    SELECT
        *
      , DENSE_RANK() OVER (PARTITION BY customer_table.customer ORDER BY brought_count.brought DESC) as rank
      FROM
        customer_table
        INNER JOIN (
            SELECT
                customer_id
              , COUNT(customer_id) as brought
              FROM
                order_table
            GROUP BY
                item_id
        ) as brought_count ON (customer_table.customer_id = brought_count.customer_id)
 WHERE
    rank = 1;

と WHERE 句で制御して取得する。これを必要な数だけ JOIN すればデータは取得できることがわかった。
お仕事で書いたままを書くわけにはいかないので、使う際はコピペしていい感じに調整はしてほしい。

掲げている使命

好きとスキルを駆使して、心身と経済が豊かな日本社会を創造する

いま、目の前で困っていることがある方のために僕の「好き」と「スキル」がお役にたつかもしれません。
こちら(↓)の自己紹介で僕の得意を書いていますので、お困り事のある方は、コメントをいただけるとありがたいです。


支援のお願い

本記事は無料でお読みいただけますが、投げ銭形式にしているので、気に入ったらご購入いただけると嬉しいです。
また、下記リンクのご支援をいただけると励みになります。

素材引用元

アイコン

見出し

この記事が気に入ったらサポートをしてみませんか?