У меня есть таблица postgres с отметками времени и округленной разницей в часах между текущей и предыдущей (с задержкой) отметкой времени в difftime

 timestamp               type    difftime
 2013-09-14 14:19:46     JPR03   2 
 2013-09-14 15:11:48     JPR03   1 
 2013-09-14 16:11:49     JPR03   1 
 2013-09-14 17:13:45     JPR03   1 
 2013-09-22 00:08:38     JPR03   175 
 2013-09-22 00:10:11     JPR03   0 
 2013-09-22 01:11:36     JPR03   1 
 2013-09-22 02:16:11     JPR03   1 
 2013-09-22 03:13:16     JPR03   1 
 2013-09-22 04:05:38     JPR03   1 
 2013-09-22 06:10:11     JPR03   2 
 2013-09-22 07:26:43     JPR03   1 
 2013-09-22 08:17:35     JPR03   1 
 2013-09-22 09:16:08     JPR03   1 
 2013-09-22 10:16:08     JPR03   1 
 2013-10-01 06:15:07     JPR03   212 
 2013-10-01 06:15:12     JPR03   0 
 2013-10-02 07:15:15     JPR03   25 
 2013-10-02 08:05:09     JPR03   1 

Моя цель - создать инкрементную последовательность номеров строк, которая увеличивается на 1 тогда и только тогда, когда значение в difftime выше определенного порога x (упорядоченного по времени). Если x = 5, то результат будет выглядеть так:

 timestamp               type    difftime  rownum
 2013-09-14 14:19:46     JPR03   2         0
 2013-09-14 15:11:48     JPR03   1         0
 2013-09-14 16:11:49     JPR03   1         0
 2013-09-14 17:13:45     JPR03   1         0
 2013-09-22 00:08:38     JPR03   175       1
 2013-09-22 00:10:11     JPR03   0         1
 2013-09-22 01:11:36     JPR03   1         1
 2013-09-22 02:16:11     JPR03   1         1
 2013-09-22 03:13:16     JPR03   1         1
 2013-09-22 04:05:38     JPR03   1         1
 2013-09-22 06:10:11     JPR03   2         1
 2013-09-22 07:26:43     JPR03   1         1
 2013-09-22 08:17:35     JPR03   1         1
 2013-09-22 09:16:08     JPR03   1         1
 2013-09-22 10:16:08     JPR03   1         1
 2013-10-01 06:15:07     JPR03   212       2
 2013-10-01 06:15:12     JPR03   0         2
 2013-10-02 07:15:15     JPR03   25        3
 2013-10-02 08:05:09     JPR03   1         3

Я знаком с функциями RANK(), DENSE_RANK(), ROW_NUMBER() и COALESCE(), но ни одна из них не достигнет цели увеличения номера строки по условию (начиная с 0 ). Любые предложения о том, как реализовать этот вид присвоения переменных или какие функции могут быть применены здесь для разделения на основе условия?

0
the_darkside 3 Фев 2021 в 09:36

2 ответа

Лучший ответ

демонстрация: db <> скрипка

Вы можете использовать кумулятивную функцию SUM() с условным значением: добавьте 1, если условие выполняется, 0 в противном случае:

SELECT
    *,
    SUM(
        CASE 
            WHEN diff >= 5 THEN 1
            ELSE 0
        END
    ) OVER (ORDER BY ts)
FROM --<your query>
3
S-Man 3 Фев 2021 в 07:01

В Postgres я бы рекомендовал использовать filter:

select q.*,
       count(*) filter (where diff > ?) over (order by ts) as rownum
from <your query> q;

? - это заполнитель любого значения, которое вы имеете в виду.

0
Gordon Linoff 3 Фев 2021 в 13:38
66022412