PostgreSQL窗口函数:按列分组而不排序(~Python itertools.groupby)
我需要在PostgreSQL中基于一列对一个表进行分区,而不进行排序&使结果唯一;基本上,我试图实现的是在PostgreSQL中从Python复制PostgreSQL窗口函数:按列分组而不排序(~Python itertools.groupby),sql,postgresql,Sql,Postgresql,我需要在PostgreSQL中基于一列对一个表进行分区,而不进行排序&使结果唯一;基本上,我试图实现的是在PostgreSQL中从Python复制itertools.groupby()行为 给定包含两列的表: 1 C 2 C 3 C 4 C 5 C 6 C 7 C 8 C 9 C 10 S 11 E 12 E 13 E 14 E 15 E 16 C 17 C 18 C 19 C 20 E 21 E 22 E 23 E 24 E 1
itertools.groupby()
行为
给定包含两列的表:
1 C
2 C
3 C
4 C
5 C
6 C
7 C
8 C
9 C
10 S
11 E
12 E
13 E
14 E
15 E
16 C
17 C
18 C
19 C
20 E
21 E
22 E
23 E
24 E
1 C
2 C
3 C
4 C
5 C
6 C
7 C
8 C
9 C
10秒
11 E
12 E
13 E
14 E
15 E
16 C
17 C
18 C
19 C
20 E
21 E
22 E
23 E
24 E
我想用第二个中的值对它进行分区(同时保留现有的顺序),最终得到以下结果:
1 C 1
2 C 1
3 C 1
4 C 1
5 C 1
6 C 1
7 C 1
8 C 1
9 C 1
10 S 2
11 E 3
12 E 3
13 E 3
14 E 3
15 E 3
16 C 4
17 C 4
18 C 4
19 C 4
20 E 5
21 E 5
22 E 5
23 E 5
24 E 5
1 C 1
2 C 1
3 C 1
4 C 1
5 C 1
6 C 1
7 C 1
8 C 1
9 C 1
10秒2
11 E 3
12 E 3
13 E 3
14 E 3
15 E 3
16 C 4
17 C 4
18 C 4
19 C 4
20 E 5
21 E 5
22 E 5
23 E 5
24 E 5
我试图通过窗口函数实现这一点,使用行数()
和滞后()
的组合来比较当前行和前一行,看看它是否发生了变化。这种情况下的问题是,我还需要一个变量,该变量在值每次更改时都会递增。尽管可以完全基于窗口函数提出解决方案,但这种结果集的有状态处理似乎最适合于迭代方法。这里有一个问题以前问过一些类似的问题:
基本上,只使用窗口的方法可以归结为在每个分区的开始处生成一个整数列,其中包含一个“1”(或任何其他正整数)(因此,col2LAG(col2)
),然后使用另一个窗口聚合将这些组指示符从结果集的开始累加到当前行。它是有效的,它的复杂性和(我相信)性能都很差。试试这个:
WITH T1 AS
(
SELECT
id,
grp,
LAG(grp) OVER (ORDER BY id) IS DISTINCT FROM grp AS changes
FROM yourtable
)
SELECT id, grp, SUM(changes::int) OVER (ORDER BY id) FROM T1