我正在输入 ID 号。对于每个 ID#,都有一个状态“已批准”、“存在”、“草稿”、“活动”、“审核”、“初步”、“开发”或 NULL 或已过时。 我**不想**想要包含 ID 等于“已过时”的任何行。
有时会有超过 1 个 ID #,有时只有 1 个。我试图说明 ID # 是否是唯一的 1,然后将其拉入。 但是,如果有多个 ID #,我想检查其中一种状态是否等于“释放”。 如果确实如此并且其他状态等于 NULL,那么我只想要“释放”状态。
但是,我不想完全阻止 NULL 值,因为可能存在一种情况,其中只有一个 ID,即状态 (NULL)。 在这种情况下,我会关注结果。
我想我需要在 WHERE 语句中添加一个 CASE WHEN 子句,其中如果 ID HAVING COUNT > 1,则检查状态。
If this were my data-----
53689875 state = Obsolete SID # 1
78569852 state = NULL SID # 2
72215538 state = NULL SID # 3
72215538 state = Release SID # 4
78542155 state = Approved SID # 5
75369521 state = Draft SID # 6
32586846 state = Release SID # 7
32586846 state = NULL SID # 8
44855221 state = Obsolete SID # 9
65475331 state = Development SID # 10
56665875 state = NULL SID # 11
21233698 state = Release SID # 12
11558254 state = Review SID # 13
11558254 state = Obsolete SID # 14
89756852 state = Obsolete SID # 15
This would be my output expected -----
78569852 state = NULL SID # 2
72215538 state = Release SID # 4
78542155 state = Approved SID # 5
75369521 state = Draft SID # 6
32586846 state = Release SID # 7
65475331 state = Development SID # 10
56665875 state = NULL SID # 11
21233698 state = Release SID # 12
11558254 state = Review SID # 13
这样的事情值得深思
select *
from (
select *,
rank() over (
partition by id
order by case when state is null then 0
else 1
end desc
) state_precedence
from your_table
where state <> 'obsolete'
) t
where state_precedence = 1
因此,如果只有一个 id 处于 null 状态,则该 id 将具有最大排名并被选择。但如果该 ID 有多个记录,您将排除空值。
这只是我在进行这种优先级选择时倾向于使用的一般方法。您可能需要根据您想要的确切行为来调整它 - 如果您有两个(或任何数量)的 id 记录并且它们都是空的,这将引入所有这些记录。不知道是不是你想要的。
此外,如果您有多个记录 1 个“已过时”、1 个“空”,这将引入 null。