SQL совокупный отчетливый счет - PullRequest
1 голос
/ 11 марта 2020

У меня есть таблица 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

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Нет причин думать об этом как о проблеме пропасти и островов. Я имею в виду, что это так, но есть более простое решение.

В этом случае используйте 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;
1 голос
/ 11 марта 2020

Это проблема пробелов и островков, когда вы хотите сгруппировать «смежные» строки.

Один подход основан на разнице между номерами строк для идентификации групп. Если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...