同ID多个状态

问题描述 投票:0回答:1

我正在输入 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
sql ssms
1个回答
0
投票

这样的事情值得深思

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。

© www.soinside.com 2019 - 2024. All rights reserved.