SQL:为 ID 高于先前且满足条件的条目选择不同的计数
Posted
技术标签:
【中文标题】SQL:为 ID 高于先前且满足条件的条目选择不同的计数【英文标题】:SQL: select a count distinct for entries with higher ID than previous and conditions met 【发布时间】:2021-02-16 06:29:08 【问题描述】:假设我在一个表中有以下数据:
ID ENTRY NAME ENTRY_ID
6 REMOVE ALICE 333
5 ADD JOHN 333
4 REMOVE JOHN 222
3 ADD ALICE 222
2 ADD AMANDA 111
1 ADD JOHN 111
我正在尝试计算所有在其最新条目中具有“ADD”的人的数量,该条目由“ENTRY_ID”中的数字较大来确定。
所以在这种情况下,我要查找的计数将是 2,因为 333 中的“JOHN”有一个“ADD”,而 111 中的“AMANDA”有一个“ADD”——两者都没有更高的ENTRY_ID 带有“REMOVE”,与“ALICE”的情况一样,她不应该算作她最新(最高)的 ENTRY_ID 是“REMOVE”。
我怎样才能最容易地做到这一点?
【问题讨论】:
【参考方案1】:你可以使用窗口函数:
select count(*)
from (
select t.*, row_number() over(partition by name order by entry_id) rn
from mytbale t
) t
where rn = 1 and entry = 'ADD'
或者使用first_value()
:
select count(*) cnt
from (
select t.*, first_value(entry) over(partition by name order by entry_id desc) last_entry
from mytbale t
) t
where last_entry = 'ADD'
这需要 mysql 8.0。在早期版本中,一个选项使用相关子查询进行过滤:
select count(*)
from mytable t
where
t.entry = 'ADD'
and t.entry_id = (select max(t1.entry_id) from mytable t1 where t1.name = t.name)
【讨论】:
【参考方案2】:您可以使用聚合获取列表:
select name
from t
group by name
having max(entry_id) = max(case when entry = 'ADD' then entry_id end);
这将获取“ADD”的条目 id 与最后一个条目 id 匹配的所有名称。
您可以使用子查询并获取计数:
select count(*)
from (select name
from t
group by name
having max(entry_id) = max(case when entry = 'ADD' then entry_id end)
) t;
否则,我可能会建议一个相关的子查询:
select count(*)
from t
where t.entry = 'ADD' and
t.entry_id = (select max(t2.entry_id) from t t2 where t2.name = t.name);
【讨论】:
以上是关于SQL:为 ID 高于先前且满足条件的条目选择不同的计数的主要内容,如果未能解决你的问题,请参考以下文章