使用特定条件排除记录
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.
我有一个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.