SQL累计非重复计数

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

我有一个列出单个事件的SQL表,我正在尝试汇总以获取一组事件,如下所示。

id |Name | Date|
0  |A    |2018-05-08
1  |A    |2018-05-09
2  |B    |2018-05-11
3  |B    |2018-05-12
4  |A    |2018-05-17
5  |A    |2018-05-17
6  |A    |2018-05-18
7  |C    |2018-05-25
8  |C    |2018-05-26
9  |B    |2018-05-27

成为:

Name|Group
|A  |1
|B  |2
|A  |3
|C  |4
|B  |5

我相信这是Count()的某种形式,然后是OVER BY,它们总是使我绊倒。我什至不知道该怎么算,因为很少将这些名称组合在一起。到目前为止,我有以下内容:

select
    Name
    ,Count(Name)
from table
Group BY
    Name
sql count gaps-and-islands
2个回答
0
投票

这是一个空白和孤岛的问题,您想在其中将“相邻”行分组在一起。

一种方法依靠行号之间的差异来识别组。如果id连续增加1,请考虑:

select 
    name,
    row_number() over(partition by name, id - rn order by min(date)) grp
from (
    select
        t.*,
        row_number() over(partition by name order by date) rn
    from mytable t
) t
group by name, id - rn
order by grp

否则,我们可以用id生成row_number()

select 
    name,
    row_number() over(partition by name, rn1 - rn2 order by min(date)) grp
from (
    select
        t.*,
        row_number() over(order by date) rn1,
        row_number() over(partition by name order by date) rn2
    from mytable t
) t
group by name, rn1 - rn2
order by grp

0
投票

没有理由将其视为差距与岛屿的问题。我的意思是,但是有一个更简单的解决方案。

在这种情况下,请使用lag()row_number()

select name, row_number() over (order by date, id) as grp
from (select t.*,
             lag(name) over (order by date, id) as prev_name
      from t
     ) t
where prev_name is null or prev_name <> name;
© www.soinside.com 2019 - 2024. All rights reserved.