从 SQL 到 SPL:分组后每组前面增加符合条件的记录

postgresql 库的某视图,row_index 字段是下划线分隔的字符串,也是分组字段。有些组的 row_index 可分为 3 部分,有些可分为 2 部分。

row_index

id

seq

value_text

1007_0_0

1007

1

800

1007_0_0

1007

2

1110

1007_0_0

1007

4

road, roadwork

1007_0_0

1007

5

100

1007_0_1

1007

1

800

1007_0_1

1007

2

1115

1007_0_1

1007

4

road, roadwork

1007_0_1

1007

5

100

1007_0_2

1007

1

800

1007_0_2

1007

2

1105

1007_0_2

1007

4

road, roadwork

1007_0_2

1007

5

100

1007_0_3

1007

1

800

1007_0_3

1007

2

1120

1007_0_3

1007

4

road, roadwork

1007_0_3

1007

5

100

1007_0

1007

6

Rosedale

1007_0

1007

8

139

现在要在 row_index 可分为 3 部分的每一组记录前面,增加 row_index 可分为 2 部分的那一组记录,并将 row_index 修改为每一组的 row_index。

row_index

id

seq

value_text

1007_0_0

1007

6

Rosedale

1007_0_0

1007

8

139

1007_0_0

1007

1

800

1007_0_0

1007

2

1110

1007_0_0

1007

4

road, roadwork

1007_0_0

1007

5

100

1007_0_1

1007

6

Rosedale

1007_0_1

1007

8

139

1007_0_1

1007

1

800

1007_0_1

1007

2

1115

1007_0_1

1007

4

road, roadwork

1007_0_1

1007

5

100

1007_0_2

1007

6

Rosedale

1007_0_2

1007

8

139

1007_0_2

1007

1

800

1007_0_2

1007

2

1105

1007_0_2

1007

4

road, roadwork

1007_0_2

1007

5

100

1007_0_3

1007

6

Rosedale

1007_0_3

1007

8

139

1007_0_3

1007

1

800

1007_0_3

1007

2

1120

1007_0_3

1007

4

road, roadwork

1007_0_3

1007

5

100

可以将row_index 可分为 3 部分的记录按 row_index 分组,然后处理每组记录,在每组记录前面都合并上 row_index 可分为 2 部分的记录。但 SQL 分组后必须立刻汇总,不能保持子集继续处理每组记录。这就要绕路解决,用多层嵌套的窗口函数绕过这个难题,很难写。

SPL 支持分组后保持子集,可以继续处理每组记录。



1

=postgresql.query("select * from view1")

2

=A1.select(row_index.split("_").len()==2)

3

=(A1\A2).group@u(row_index)

4

=A3.conj(A2.new(A3.row_index,id,seq,value_text)|~)

A1: 通过JDBC查询数据库。

A2:取出row_index 可分为 2 部分的那组记录。

A3:从完整数据中去掉A2,即row_index 可分为 3 部分的记录。在保持顺序不变的情况下,对这些记录分组。符号\表示差集,group@u表示分组后保持原序。

A4:循环每组数据:按A2新建二维表,将row_index改成本组的row_index,其他字段保持不变,将新二维表与本组数据合并。最后合并各组数据。符号|表示合并集合成员。

问题来源:https://stackoverflow.com/questions/78346354/adding-tuple-rows-to-each-subtuple-group-in-sql