SQL按两列重复值排序:实现同手机号记录聚合至对应同名分组末尾
排序逻辑修改方案
原SQL的排序规则是仅按「每个姓名对应的最小手机号」全局排序,导致拥有相同手机号的不同姓名记录会分散到各自姓名的排序位置,无法满足同手机号挂靠到最先出现的姓名组末尾的需求。
修改后SQL
SELECT a.[name], a.phone FROM Tests.dbo.sort_test6 AS a -- 计算每个姓名的基准排序值(对应姓名下最小的手机号) JOIN ( SELECT [name], MIN(phone) AS min_phone_by_name FROM Tests.dbo.sort_test6 GROUP BY [name] ) AS dt_name ON a.[name] = dt_name.[name] -- 计算每个手机号的最小排序锚点:持有该手机号的所有姓名里最小的基准排序值 JOIN ( SELECT phone, MIN(min_phone_by_name) AS min_anchor_for_phone FROM Tests.dbo.sort_test6 b JOIN ( SELECT [name], MIN(phone) AS min_phone_by_name FROM Tests.dbo.sort_test6 GROUP BY [name] ) dt_name2 ON b.name = dt_name2.name GROUP BY phone ) dt_phone ON a.phone = dt_phone.phone ORDER BY min_anchor_for_phone, -- 原生属于当前锚点的姓名组排前面,跨姓名挂靠的同手机号记录排后面 CASE WHEN dt_name.min_phone_by_name = dt_phone.min_anchor_for_phone THEN 0 ELSE 1 END, [name], phone
逻辑说明
- 保留了原需求的核心规则:同姓名的记录聚类展示,同一姓名下的记录按手机号升序排列
- 新增的手机号锚点规则保证:所有持有相同手机号的记录都会被归类到该手机号最早出现的姓名组的排序位置
- CASE判断规则保证:原生属于该排序位置的姓名所有记录排完后,再排其他姓名挂靠过来的同手机号记录,完全符合预期效果
内容的提问来源于stack exchange,提问作者SashaSQL
相关产品推荐
相关产品推荐

