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

MySQL中基于Group By结合Row_Number实现分组排名需求

解决方案:按多字段分组并基于日期排序排名

当前查询的问题在于row_number()未指定分组逻辑,导致所有数据统一排序。要实现相同attr_1、attr_2、attr_3组合的客户在组内独立排名,且按注册日期越早排名越靠前,只需给窗口函数添加PARTITION BY子句,并调整排序字段为date:

select
    attr_1, attr_2, attr_3, date, ID
    , row_number() over (PARTITION BY attr_1, attr_2, attr_3 ORDER BY date ASC) AS POSITION
FROM Table

关键逻辑说明

  • PARTITION BY attr_1, attr_2, attr_3:将数据按这三个字段的唯一组合拆分为独立分组,每个分组内单独计算排名
  • ORDER BY date ASC:在每个分组内部,按照注册日期升序排列,日期越早的记录排名越靠前(row_number()会从1开始依次分配序号)

补充:处理同组内日期相同的场景

如果同一分组内存在多个客户注册日期完全相同的情况,row_number()会随机给这些记录分配不同的排名。若需要相同日期的客户排名一致,可以根据需求替换为以下函数:

  • rank():相同日期的记录会获得相同排名,后续排名会跳过空缺的序号(比如两个第1名,下一个是第3名)
  • dense_rank():相同日期的记录会获得相同排名,后续排名保持连续(比如两个第1名,下一个是第2名)

示例代码:

-- 使用rank()的写法
select
    attr_1, attr_2, attr_3, date, ID
    , rank() over (PARTITION BY attr_1, attr_2, attr_3 ORDER BY date ASC) AS POSITION
FROM Table

-- 使用dense_rank()的写法
select
    attr_1, attr_2, attr_3, date, ID
    , dense_rank() over (PARTITION BY attr_1, attr_2, attr_3 ORDER BY date ASC) AS POSITION
FROM Table

内容的提问来源于stack exchange,提问作者Kami Sli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:57:50