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 すればデータは取得できることがわかった。
お仕事で書いたままを書くわけにはいかないので、使う際はコピペしていい感じに調整はしてほしい。
掲げている使命
好きとスキルを駆使して、心身と経済が豊かな日本社会を創造する
いま、目の前で困っていることがある方のために僕の「好き」と「スキル」がお役にたつかもしれません。
こちら(↓)の自己紹介で僕の得意を書いていますので、お困り事のある方は、コメントをいただけるとありがたいです。
支援のお願い
本記事は無料でお読みいただけますが、投げ銭形式にしているので、気に入ったらご購入いただけると嬉しいです。
また、下記リンクのご支援をいただけると励みになります。
素材引用元
アイコン
見出し
この記事が気に入ったらサポートをしてみませんか?