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

SQL Server中如何保留同一ID下首条Type=0记录并排除其余同类型记录

需求:保留每个ID下第一条Type=0的记录,排除其余Type=0记录

需求说明

编写SELECT查询,显示所有记录,但需排除同一ID下Type列值为0的第一条记录之外的所有Type=0记录。

当前数据

ID  Type    Name
123 0   Sathiya
123 1   Kumar
123 NULL    Mohan
123 6   Ranjith
124 0   Sathiya
123 0   John
125 6   Albert
123 0   Sathiya
124 0   Kumar
124 0   Joseph

预期结果

ID  Type    Name
123 0   Sathiya
123 1   Kumar
123 NULL    Mohan
123 6   Ranjith
124 0   Sathiya
125 6   Albert

现有查询问题

现有查询会对所有Type进行分区,无法仅针对Type=0的记录处理,因此无法得到预期结果:

SELECT
ROW_NUMBER() PARTITION BY ID,Type ORDER BY StartTime ASC AS RN,
*
INTO #temp1
FROM TABLE

SELECT 
*
FROM #temp1
WHERE RN>1

可行解决方案

方案一:CTE+CASE标记行号

通过CASE语句仅为Type=0的记录生成按ID分区的行号,其他记录统一标记为行号1,最后筛选行号为1的记录即可:

WITH RankedRecords AS (
    SELECT 
        ID,
        Type,
        Name,
        CASE 
            WHEN Type = 0 THEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY StartTime ASC)
            ELSE 1
        END AS RN
    FROM YourTable
)
SELECT ID, Type, Name
FROM RankedRecords
WHERE RN = 1;

方案二:UNION ALL拼接结果集

分两部分查询后拼接:第一部分取每个ID下第一条Type=0的记录,第二部分取所有非Type=0的记录:

-- 取每个ID下第一条Type=0的记录
SELECT ID, Type, Name
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY StartTime ASC) AS RN
    FROM YourTable
    WHERE Type = 0
) t
WHERE RN = 1

UNION ALL

-- 取所有非Type=0的记录(包括Type为NULL的情况)
SELECT ID, Type, Name
FROM YourTable
WHERE Type != 0 OR Type IS NULL;

两种方案都能实现需求,方案一代码更简洁,方案二逻辑更直观,可根据实际场景选择。

内容的提问来源于stack exchange,提问作者Sathiya Kumar V M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:35:33