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

基于优先级为每个ContactID从数据表中选择单条记录

按优先级为每个ContactID选取单条记录的SQL解决方案

这是个非常典型的分组优先级筛选场景,下面给你几种通用且高效的实现方式,适配大多数主流SQL数据库(SQL Server、PostgreSQL、MySQL 8+、Oracle等):

核心解法:使用ROW_NUMBER()窗口函数(推荐)

这种方法逻辑清晰,兼容性最好,也是最易维护的写法:

WITH ranked_contacts AS (
    SELECT 
        ContactID,
        PhoneNumber, -- 替换成你实际需要返回的字段
        PhoneType,
        -- 按ContactID分组,给每组内的记录按优先级排序
        ROW_NUMBER() OVER (
            PARTITION BY ContactID 
            ORDER BY 
                CASE PhoneType 
                    WHEN 'Mob' THEN 1  -- 最高优先级
                    WHEN 'Work' THEN 2 -- 次之
                    WHEN 'Hom' THEN 3  -- 再次之
                    ELSE 4             -- 其他类型排最后,会被过滤
                END ASC
        ) AS rn
    FROM your_table_name -- 替换为你的数据表名
)
SELECT 
    ContactID,
    PhoneNumber,
    PhoneType
FROM ranked_contacts
WHERE rn = 1; -- 只取每组内优先级最高的第一条记录

关键部分解释:

  • PARTITION BY ContactID:将数据按ContactID分组,确保每个联系人的记录单独处理
  • ORDER BY CASE...:为不同PhoneType分配优先级权重,数值越小优先级越高
  • ROW_NUMBER():给每组内的记录按优先级顺序编号,rn=1就是我们需要的目标记录

适配老版本MySQL(无CTE支持)的写法

如果你的MySQL版本低于8.0,不支持CTE(WITH语句),可以改用子查询:

SELECT 
    ContactID,
    PhoneNumber,
    PhoneType
FROM (
    SELECT 
        ContactID,
        PhoneNumber,
        PhoneType,
        ROW_NUMBER() OVER (
            PARTITION BY ContactID 
            ORDER BY 
                CASE PhoneType 
                    WHEN 'Mob' THEN 1 
                    WHEN 'Work' THEN 2 
                    WHEN 'Hom' THEN 3 
                    ELSE 4 
                END ASC
        ) AS rn
    FROM your_table_name
) AS sub_query
WHERE rn = 1;

SQL Server专属简化写法:TOP 1 WITH TIES

如果你使用的是SQL Server,可以用TOP 1 WITH TIES进一步简化代码:

SELECT TOP 1 WITH TIES
    ContactID,
    PhoneNumber,
    PhoneType
FROM your_table_name
ORDER BY 
    ROW_NUMBER() OVER (
        PARTITION BY ContactID 
        ORDER BY 
            CASE PhoneType 
                WHEN 'Mob' THEN 1 
                WHEN 'Work' THEN 2 
                WHEN 'Hom' THEN 3 
                ELSE 4 
            END ASC
    );

注意事项:

  • 请根据你的实际数据表结构,替换代码中的your_table_name和需要返回的字段(比如PhoneNumber)
  • 如果存在多个同优先级的记录(比如同一个ContactID有两条'Mob'类型的记录),ROW_NUMBER()会随机选一条;如果需要稳定选取(比如按创建时间),可以在ORDER BY里追加额外排序条件(比如CREATE_DATE ASC)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:31:02