从 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
英文版 https://c.scudata.com/article/1733705684799