使用特定条件排除记录

Excluding Records using specific conditions

我有一个table如下

ID Type Part
CD1 Service A
CD1 Service null
CD1 Service B
CD1 Sales A
CD2 Service null
CD2 Sales B
CD3 Service A
CD3 Service null

需要输出:

ID Type Part
CD1 Service A
CD1 Service B
CD1 Sales A
CD2 Service null
CD2 Sales B
CD3 Service A

解释:例如,CD1 的服务类型为 A、B 和空值作为部分,CD2 的服务类型为空值作为部分。由于 CD1 具有 A、B 作为部分,因此必须排除空值记录,并且具有服务作为类型的 CD2 不包含除空值以外的任何值,因此不应排除。

同样,CD3 的类型为 Service,A 为 Part,为 null。由于A存在空值记录必须被排除。

这可以使用 SQL 实现吗?

提前致谢

您可以使用 ROW_NUMBER window 函数指定排名,其中空值将被指定为最小值。然后你可以 select 你 table 中值不为 null 或排名为 1 的所有行(如果在第一个位置找到 null,则意味着它是该 ID 组合的唯一值和类型):

WITH cte AS (
    SELECT *, 
           ROW_NUMBER() OVER(PARTITION BY ID, Type 
                             ORDER     BY Part DESC) AS rn
    FROM tab
)
SELECT ID,
       Type, 
       Part
FROM cte
WHERE Part IS NOT NULL 
   OR rn = 1

试试看 here.