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

如何在SQL Server中按首次RandStat过滤重复RepID记录

SQL Server 实现同一ICD下重复RepID的过滤需求

我正在使用SQL Server,现有如下表格:

RepID  ICD  Diagnosed  RandStat
-------------------------------
1001   A    1          11
1002   A    0          11
1003   A    0          11
1005   A    1          11

1003   A    1          22
1005   A    0          22
1008   A    1          22
1009   A    0          22

1001   A    0          33
1004   A    1          33
1005   A    0          33
1007   A    0          33

1003   A    0          44
1004   A    0          44
1005   A    1          44
1007   A    1          44


1001   B    0          11
1004   B    1          11
1006   B    1          11
1008   B    1          11

1004   B    0          22
1006   B    1          22
1008   B    0          22
1009   B    1          22

1001   B    0          33
1002   B    1          33
1003   B    1          33
1006   B    0          33

1003   B    1          44
1004   B    0          44
1005   B    0          44
1007   B    1          44

需求说明

针对同一ICD,按RandStat升序排列,过滤掉重复出现的RepID记录:若某RepID已出现在RandStat 11中,则移除其在RandStat 22及以上的所有同ICD记录。

预期结果

RepID  ICD  Diagnosed  RandStat
-------------------------------
1001   A    1          11
1002   A    0          11
1003   A    0          11
1005   A    1          11

1008   A    1          22
1009   A    0          22

1004   A    1          33
1007   A    0          33

1001   B    0          11
1004   B    1          11
1006   B    1          11
1008   B    1          11

1009   B    1          22

1002   B    1          33
1003   B    1          33

1005   B    0          44
1007   B    1          44

尝试的查询语句(未得到预期结果)

SELECT A.*
FROM MyTable A 
INNER JOIN MyTable B ON A.RepID = B.RepID
                     AND A.ICD = B.ICD
                     AND A.RandStat < B.RandStat

解决方案

核心逻辑是保留每个ICD下每个RepID的首次出现记录(按RandStat升序),过滤后续重复的RepID记录,以下两种方法均可实现:

方法一:使用窗口函数标记首次出现

WITH RankedRecords AS (
    SELECT 
        *,
        -- 按ICD分组、RepID分区,RandStat升序排序,标记每条记录的出现顺序
        ROW_NUMBER() OVER (PARTITION BY ICD, RepID ORDER BY RandStat) AS rn
    FROM MyTable
)
SELECT RepID, ICD, Diagnosed, RandStat
FROM RankedRecords
WHERE rn = 1
ORDER BY ICD, RandStat, RepID;

方法二:使用关联查询过滤已出现的RepID

SELECT t.*
FROM MyTable t
WHERE NOT EXISTS (
    SELECT 1
    FROM MyTable t2
    WHERE t2.ICD = t.ICD
      AND t2.RepID = t.RepID
      AND t2.RandStat < t.RandStat
)
ORDER BY t.ICD, t.RandStat, t.RepID;

两种方法都能精准匹配你的预期结果,自动过滤掉同一ICD下RepID的后续重复记录。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:35:29