You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按客户分组获取Top3最常光顾门店?SQL语句问题排查

按客户统计最常光顾的前3家门店SQL修正

需求

按每个客户统计其最常光顾的前3家门店。

原始数据表

客户门店金额
PeterABC10
PeterABC10
PeterABC10
PeterABC10
Peter7eleven5
Peter7eleven5
Peter7eleven5
PeterAddidas64
PeterAddidas64
PeterNike52
Ben7eleven5
Ben7eleven7
Ben7eleven7
Ben7eleven3
BenNike48
BenNike48
BenNike48
BenPuma67
BenPuma67
BenAddidas55
BenABC12
DianaPuma58
DianaPuma58
DianaPuma58
DianaPuma42
DianaABC12
DianaABC12
DianaABC12
DianaSony230
DianaSony130
KateZara58
KateZara58
KateZara58
KateZara42
KatePost12
KatePost12
KatePost12
KateLG230
KateLG130
KateABC12

期望结果表

客户门店门店光顾频次排名
PeterABC1
Peter7eleven2
PeterAddidas3
Ben7eleven1
BenNike2
BenPuma3
DianaPuma1
DianaABC2
DianaSony3
KateZara1
KatePost2
KateLG3

原SQL问题分析

你写的SQL有两个核心问题:

  1. 未先对客户+门店聚合统计光顾频次,直接用窗口函数会让每条原始数据生成一个排名,结果完全偏离需求;
  2. 窗口函数的PARTITION BY错误包含了store,导致每个客户的每个门店单独分区,排名失去意义。

修正后的SQL

SELECT 客户, 门店, 门店光顾频次排名
FROM (
    SELECT 
        客户, 
        门店, 
        RANK() OVER (PARTITION BY 客户 ORDER BY 光顾频次 DESC) AS 门店光顾频次排名
    FROM (
        -- 第一步:统计每个客户每个门店的光顾次数
        SELECT 
            客户, 
            门店, 
            COUNT(*) AS 光顾频次
        FROM my.table
        GROUP BY 客户, 门店
    ) AS 客户门店频次统计
) AS 带排名的统计结果
WHERE 门店光顾频次排名 <= 3;

逻辑说明

  1. 最内层子查询:按客户和门店分组,统计每个客户在每家门店的光顾次数;
  2. 中间层子查询:基于统计结果,按客户分区,按光顾频次降序用RANK()生成排名;
  3. 最外层查询:筛选排名前3的记录,得到最终结果。

如果需要处理并列排名场景,可根据需求替换RANK():

  • DENSE_RANK():并列记录占相同排名,后续排名连续(如两个第1,下一个是第2);
  • ROW_NUMBER():即使频次相同,也生成唯一连续排名(需额外排序字段保证结果稳定)。

内容的提问来源于stack exchange,提问作者Daniyar Azimbayev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:17:30