SQL是一个累积的不同计数

SQL是一个累积的不同计数,sql,group-by,count,window-functions,gaps-and-islands,Sql,Group By,Count,Window Functions,Gaps And Islands,我有一个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

我有一个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
我相信这是某种形式的计数,然后经过,这总是绊倒我。我甚至不知道我会数到什么,因为几乎没有把这些名字组合在一起。到目前为止,我有以下几点:

select
    Name
    ,Count(Name)
from table
Group BY
    Name

这是一个间隙和孤岛问题,您希望将相邻行分组在一起

一种方法依赖行号之间的差异来识别组。如果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:


没有理由认为这是一个缺口和岛屿问题。我是说,是的,但有一个更简单的解决办法

在这种情况下,使用lag和row_编号:


这让我得到了我想要的,但我应该指定。有办法按日期订购吗?@JackArmstrong:orderbymindate.orderbymindate而不是grp。此外,我还将maxdate与maxdate一样包含在整个select*from中。
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
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;