У меня есть таблица 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 ). Любые предложения о том, как реализовать этот вид присвоения переменных или какие функции могут быть применены здесь для разделения на основе условия?
2 ответа
Вы можете использовать кумулятивную функцию SUM()
с условным значением: добавьте 1
, если условие выполняется, 0
в противном случае:
SELECT
*,
SUM(
CASE
WHEN diff >= 5 THEN 1
ELSE 0
END
) OVER (ORDER BY ts)
FROM --<your query>
В Postgres я бы рекомендовал использовать filter
:
select q.*,
count(*) filter (where diff > ?) over (order by ts) as rownum
from <your query> q;
?
- это заполнитель любого значения, которое вы имеете в виду.
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.