表格原样
客户 | 商店 | 金额 |
---|---|---|
彼得 | ABC | 10 |
彼得 | ABC | 10 |
彼得 | ABC | 10 |
彼得 | ABC | 10 |
彼得 | 711 | 5 |
彼得 | 711 | 5 |
彼得 | 711 | 5 |
彼得 | 阿迪达斯 | 64 |
彼得 | 阿迪达斯 | 64 |
彼得 | 耐克 | 52 |
本 | 711 | 5 |
本 | 711 | 7 |
本 | 711 | 7 |
本 | 711 | 3 |
本 | 耐克 | 48 |
本 | 耐克 | 48 |
本 | 耐克 | 48 |
本 | 美洲狮 | 67 |
本 | 美洲狮 | 67 |
本 | 阿迪达斯 | 55 |
本 | ABC | 12 |
戴安娜 | 美洲狮 | 58 |
戴安娜 | 美洲狮 | 58 |
戴安娜 | 美洲狮 | 58 |
戴安娜 | 美洲狮 | 42 |
戴安娜 | ABC | 12 |
戴安娜 | ABC | 12 |
戴安娜 | ABC | 12 |
戴安娜 | 索尼 | 230 |
戴安娜 | 索尼 | 130 |
凯特 | 扎拉 | 58 |
凯特 | 扎拉 | 58 |
凯特 | 扎拉 | 58 |
凯特 | 扎拉 | 42 |
凯特 | 发帖 | 12 |
凯特 | 发帖 | 12 |
凯特 | 发帖 | 12 |
凯特 | LG | 230 |
凯特 | LG | 130 |
凯特 | ABC | 12 |
我尝试得到的结果
客户 | 商店 | 最常光顾商店排名 |
---|---|---|
彼得 | ABC | 1 |
彼得 | 711 | 2 |
彼得 | 阿迪达斯 | 3 |
本 | 711 | 1 |
本 | 耐克 | 2 |
本 | 美洲狮 | 3 |
戴安娜 | 美洲狮 | 1 |
戴安娜 | ABC | 2 |
戴安娜 | 索尼 | 3 |
凯特 | 扎拉 | 1 |
凯特 | 发帖 | 2 |
凯特 | LG | 3 |
我尝试了以下脚本,但它不起作用
Select *
From (SELECT client, store,
RANK() OVER (PARTITION BY client, store ORDER BY COUNT(store) DESC) AS RN
FROM my.table) as TMP_TBL
WHERE RN<4
您的查询几乎是正确的;你的问题是你只需要按
Client
分区,而不是 Client
和 Store
:
SELECT *
FROM (
SELECT Client, Store, RANK() OVER (PARTITION BY Client ORDER BY COUNT(Store) DESC) AS RN
FROM my_table
GROUP BY Client, Store
) t
WHERE RN < 4
样本数据的输出:
Client Store RN
Ben 7eleven 1
Ben Nike 2
Ben Puma 3
Diana Puma 1
Diana ABC 2
Diana Sony 3
Kate Zara 1
Kate Post 2
Kate LG 3
Peter ABC 1
Peter 7eleven 2
Peter Addidas 3