sql - 如何根据另一列中特定值的存在获得不同的 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
任何想法和更简单的方法将不胜感激!
解决方案
一种方法是聚合:
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
是值得拥有自己的表的。
推荐阅读
- r - 在没有 base::table() 函数的 R studio 中计算频率
- asp.net-mvc - 升级到 v16.6.2 后,view/cshtml 文件中没有命中断点?
- python - 如何将颜色条调整为条形图的大小?
- git - 如何访问 heroku CI dyno 上的 git 文件?
- java - 如何从 entry.getValue 获取另一个 HasMap?
- asp.net-mvc - ASP.NET MVC 和 CRM
- r - 如何在 R 中的向量中查找和替换特定的数字序列?
- firebase - Flutter:尝试启动时收到过时的消息
- python - 使用root时Raspbian上没有声音
- regex - 正则表达式匹配后删除文本的有效方法