首页 > 解决方案 > 如何根据另一列中特定值的存在获得不同的 ID?

问题描述

我有一张带有数千个唯一 ID 的表。每个 ID 大约有 200-300 个事件代码。这是一个示例表:

ID 事件代码
1 A01G0
1 B428
2 N0030
2 B428
3 CD45
3 B428

当特定的事件代码不存在时,我想获得不同的 ID 。例如,当存在“A01G0”或“N0030”时,跳过 ID 1 和 2。

所需的输出应该是:

ID
3

我找到了这个解决方案,但由于速度不足,它不适合日常使用:

WITH    cte
        AS (SELECT
        ev.id as id
        ,ev.EventCode AS EventCode
        ,ev.EventDate

        ,ROW_NUMBER() OVER ( PARTITION BY ev.id ORDER BY ev.EventDate DESC) AS rn
        FROM eventTable ev
        WHERE NOT EXISTS( SELECT *
                          FROM eventTable 
                          WHERE ev.id = ev.id
                                AND ev.id NOT IN ('A01G0','A01G2','N0030','N0032','UN030')
                                ))
        SELECT id
        FROM cte
        WHERE rn = 1

任何想法和更简单的方法将不胜感激!

标签: sqlsql-servertsql

解决方案


一种方法是聚合:

select id
from eventTable
group by id
having sum(case when event_code in ('A01G0', 'N0030') then 1 else 0 end) = 0;

一种更有效的方法是假设您从一个每个 id 有一行的表开始。然后你会使用 use not exists

select i.id
from id_table i
where not exists (select 1
                  from eventtable et
                  where et.id = i.id and
                        et.event_code in ('A01G0', 'N0030')
                 );

特别是,这可以利用索引eventtable(id, event_code),因此应该非常快。

如果您没有每个 id 一行的表,那么我怀疑您的数据模型有问题。一般来说,一个值得拥有的实体id是值得拥有自己的表的。


推荐阅读