Как рассчитать общее время появления последовательных строк в PostgreSQL - PullRequest
2 голосов
/ 25 февраля 2020

Итак, у меня есть таблица, которая выглядит следующим образом:

id    value    ts
123     T      ts1
123     T      ts2
123     F      ts3
123     T      ts4
456     F      ts5
456     T      ts6
456     T      ts7
456     F      ts8
......

Что я хочу сделать, это подсчитать, сколько раз подряд появляется 'T' под каждым разделом идентификатора (каждый раздел идентификатора должен быть упорядочен по столбцу ц). Но не только это, я хочу знать, сколько раз появляются два последовательных T; сколько раз появляются три T '...

Итак, наконец, я хочу таблицу с двумя столбцами:

  1. num_of_consecutives

  2. times_of_occurferences_for_this_number_of_consecutives

В этом случае 2 последовательных 'T появляются один раз, а 1 последовательный T появляется один раз для идентификатора 123; 2 идентификатора подряд появляются один раз для идентификатора 456. Поэтому, суммируя их, финальная таблица должна выглядеть следующим образом:

num_of_consecutives    times_of_occurrences_for_this_number_of_consecutives
1                      1
2                      2

1 Ответ

0 голосов
/ 25 февраля 2020

Пожалуйста, проверьте это решение ( fiddle ):

with cte(id, value, ts) as (
select 123,  'T' , 'ts1'
union all
select 123,  'T' , 'ts2'
union all
select 123,  'F' , 'ts3'
union all
select 123,  'T' , 'ts4'
union all
select 456,  'F' , 'ts5'
union all
select 456,  'T' , 'ts6'
union all
select 456,  'T' , 'ts7'
union all
select 456,  'F' , 'ts8'
)
select cnt as num_of_consecutives, count(cnt) as times_of_occurrences_for_this_number_of_consecutives from(
    select value, count(*) cnt from(
       select *,row_number() over (order by ts) - row_number() over (partition by value order by ts) grp
       from cte)q
    group by grp, value 
)q1
where value = 'T'
group by value, cnt
order by cnt;

Это обсуждение также может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...