Я пытаюсь сгруппировать записи таблицы на основе условия, а затем указать в новом столбце простой целочисленный идентификатор для каждой группы, полученной из того места, где выполняется условие.
Я БЫ | ТМСТП | CAT_TYPE | ТЕЛЕГРАММЗЭХЛЕР |
---|---|---|---|
1 | 2022-05-03 20:52:02 | 32 | 5004 |
2 | 2022-05-03 20:51:34 | 32 | 5002 |
3 | 2022-05-03 20:51:34 | 32 | 5001 |
4 | 2022-05-03 20:51:33 | 32 | 5000 |
5 | 2022-05-03 20:41:22 | 32 | 4996 |
6 | 2022-05-03 20:41:21 | 32 | 4995 |
Мне нужно присвоить один и тот же идентификатор тем строкам, чей номер TELEGRAMMZAEHLER следует за следующим (например, строки 2 и 3 имеют TZ 5002 и 5001, поэтому они являются последовательными и должны принадлежать одному и тому же идентификатору группы.)
Колонка GRUPPE была бы моим желаемым результатом. Строки со 2 по 4 принадлежат одному и тому же идентификатору группы, но тогда строки 5 и 6 должны иметь другой идентификатор, потому что TZ в строке 5 не следует за TZ в строке 4.
Я БЫ | ТМСТП | CAT_TYPE | ТЕЛЕГРАММЗЭХЛЕР | ГРУППА |
---|---|---|---|---|
1 | 2022-05-03 20:52:02 | 32 | 5004 | 1 |
2 | 2022-05-03 20:51:34 | 32 | 5002 | 2 |
3 | 2022-05-03 20:51:34 | 32 | 5001 | 2 |
4 | 2022-05-03 20:51:33 | 32 | 5000 | 2 |
5 | 2022-05-03 20:41:22 | 32 | 4996 | 3 |
6 | 2022-05-03 20:41:21 | 32 | 4995 | 3 |
Любые идеи о том, как этого можно достичь на postgreSQL?
Большое спасибо!
Мы можем использовать здесь LAG
вместе с SUM
в качестве аналитической функции:
WITH cte AS (
SELECT *, CASE WHEN TELEGRAMMZAEHLER =
LAG(TELEGRAMMZAEHLER) OVER (ORDER BY TMSTP DESC) - 1
THEN 0 ELSE 1 END AS idx
FROM yourTable
)
SELECT ID, TMSTP, CAT_TYPE, TELEGRAMMZAEHLER,
SUM(idx) OVER (ORDER BY TMSTP DESC) AS GRUPPE
FROM cte
ORDER BY TMSTP DESC;