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
相关产品推荐
相关产品推荐

