SQL Server中实现记录条件化检索的SQL方案咨询
实现思路与SQL示例
别着急,这个需求其实可以拆成两个清晰的步骤来实现,咱们一步步来:
核心思路拆解
首先把需求分成两部分处理,最后合并结果就好:
- 第一部分:保留所有RCD=6和7的记录:这部分逻辑最简单,直接筛选即可,因为需求明确要求始终检索这些记录。
- 第二部分:处理RCD=8和9的记录:核心是在同一
PKey范围内,对Rkey去重——相同Rkey的记录只保留任意一条,不同Rkey的全部保留。
具体SQL实现
假设你的源表名为SourceTable,包含的核心列是PKey、RCD、Rkey,还有其他业务列(比如Col1、Col2等),可以用以下SQL实现:
-- 第一部分:直接保留RCD=6和7的所有记录 SELECT PKey, RCD, Rkey, Col1, Col2 FROM SourceTable WHERE RCD IN (6, 7) UNION ALL -- 第二部分:处理RCD=8和9的记录,同一PKey+Rkey组合只保留任意一条 SELECT PKey, RCD, Rkey, Col1, Col2 FROM ( SELECT *, -- 按PKey和Rkey分组,给每组记录分配行号,行号为1的就是我们要保留的任意一条 ROW_NUMBER() OVER (PARTITION BY PKey, Rkey ORDER BY (SELECT NULL)) AS rn FROM SourceTable WHERE RCD IN (8, 9) ) t WHERE rn = 1;
逻辑解释
- 第一部分:用
WHERE RCD IN (6,7)直接筛选出所有符合条件的记录,没有额外处理,确保这些记录全部被检索到。 - 第二部分:
- 子查询里用
ROW_NUMBER()窗口函数,按PKey和Rkey分组(PARTITION BY PKey, Rkey),这样同一PKey下相同Rkey的记录会被分到同一组。 ORDER BY (SELECT NULL)是为了随机取组内的任意一条记录(如果不需要随机,也可以换成ORDER BY RCD或者其他列来指定取哪一条,比如优先保留RCD=8的记录)。- 最后只取行号
rn=1的记录,就完美实现了“同一PKey下Rkey相同仅取任意一条,不同则全取”的需求。
- 子查询里用
内容的提问来源于stack exchange,提问作者gaur
相关产品推荐
相关产品推荐

