Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL窗口函数:按列分组而不排序(~Python itertools.groupby)_Sql_Postgresql - Fatal编程技术网

PostgreSQL窗口函数:按列分组而不排序(~Python itertools.groupby)

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

我需要在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 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