Я хочу сгруппировать временной интервал на основе заданного допуска в postgres sql (рассмотрим интервал 1 сек c для непрерывного интервала времени) - PullRequest
0 голосов
/ 24 апреля 2020

Ниже приведен пример таблицы с заданным текущим выходом.

select id,name,timeint,count(timeint) from sample1
group by id,name,timeint
order by name,timeint;


------current output------
id  name    timeint count
1   aaa   00:00:01  2
1   aaa   00:00:02  1
1   aaa   00:00:03  1
1   aaa   00:00:04  1
1   aaa   00:00:06  1
1   aaa   00:00:08  1
2   bbb   00:00:01  1
2   bbb   00:00:02  1
2   bbb   00:00:03  1

Таким образом, вышеуказанный вывод должен быть перегруппирован таким образом, чтобы для того же идентификатора и имени, timeint с допуском 1 se c был бы считается таким же. Если timeint входит в группу последовательности все вместе.

------expected output----
id  name   timeint  count
1   aaa    00:00:01 5
1   aaa    00:00:06 1
2   bbb    00:00:08 1
2   bbb    00:00:01 3

Помогите решить эту проблему с помощью рекурсивного CTE?

1 Ответ

0 голосов
/ 24 апреля 2020

Это тип проблемы пробелов и островков. Вы можете использовать lag(), чтобы определить, где начинаются "острова". Затем используйте накопленную сумму, чтобы назначить «островную» группировку для каждой группы. Наконец, совокупность:

select id, name, min(timeint), sum(count)
from (select t.*,
             count(*) filter (where prev_ti < timetint - interval '1 second') over (partition by id, name order by timeint) as grp
      from (select t.*,
                   lag(timeint) over (partition by id, name order by timeint) as prev_ti
            from t
           ) t
     ) t
group by id, name, grp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...