查找每个客户最常光顾的前 3 家商店

问题描述 投票:0回答:1

enter image description here

表格原样

客户 商店 金额
彼得 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
sql ranking
1个回答
0
投票

您的查询几乎是正确的;你的问题是你只需要按

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
© www.soinside.com 2019 - 2024. All rights reserved.