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 高于先前且满足条件的条目选择不同的计数的主要内容,如果未能解决你的问题,请参考以下文章

如何在父表中满足相应条件的相关模型中插入条目

四博智慧物联系统快速入门-6.触发器

SQL选择所有ID的高于平均水平

使用 sql (Hive) 中的条件为每个 ID 选择随机行

SQL语句where多条件查询怎么写

CSS选择器