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

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;

逻辑解释

  1. 第一部分:用WHERE RCD IN (6,7)直接筛选出所有符合条件的记录,没有额外处理,确保这些记录全部被检索到。
  2. 第二部分:
    • 子查询里用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:31:30