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

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

逻辑说明

  1. 保留了原需求的核心规则:同姓名的记录聚类展示,同一姓名下的记录按手机号升序排列
  2. 新增的手机号锚点规则保证:所有持有相同手机号的记录都会被归类到该手机号最早出现的姓名组的排序位置
  3. CASE判断规则保证:原生属于该排序位置的姓名所有记录排完后,再排其他姓名挂靠过来的同手机号记录,完全符合预期效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:24:03