PostgreSQL - 根据条件为每组记录分配唯一 ID
PostgreSQL -Assign Unique ID to each groups of records, based on a condition
我正在尝试根据条件对 table 的记录进行分组,然后在新列中为从满足条件的位置获得的每个组设置一个简单的整数 ID。
ID
TMSTP
CAT_TYPE
TELEGRAMMZAEHLER
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 编号与下一行连续的行分配相同的 ID(例如,第 2 行和第 3 行有 TZ 5002 和 5001,因此它们是连续的并且应该属于同一个组 ID .)
GRUPPE 专栏将是我想要的结果。第 2 行到第 4 行属于同一组 ID,但是第 5 行和第 6 行应该有另一个 ID,因为第 5 行中的 TZ 与第 4 行中的 TZ 不连续。
ID
TMSTP
CAT_TYPE
TELEGRAMMZAEHLER
GRUPPE
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;
我正在尝试根据条件对 table 的记录进行分组,然后在新列中为从满足条件的位置获得的每个组设置一个简单的整数 ID。
ID | TMSTP | CAT_TYPE | TELEGRAMMZAEHLER |
---|---|---|---|
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 编号与下一行连续的行分配相同的 ID(例如,第 2 行和第 3 行有 TZ 5002 和 5001,因此它们是连续的并且应该属于同一个组 ID .)
GRUPPE 专栏将是我想要的结果。第 2 行到第 4 行属于同一组 ID,但是第 5 行和第 6 行应该有另一个 ID,因为第 5 行中的 TZ 与第 4 行中的 TZ 不连续。
ID | TMSTP | CAT_TYPE | TELEGRAMMZAEHLER | GRUPPE |
---|---|---|---|---|
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;