SQL,在组内根据相邻行修改取值 null 的列
postgreySQL 库表按 date、company 排序如下,column3 部分值为 NULL。
date |
company |
column3 |
2004-01-01 |
A |
5 |
2004-01-01 |
B |
NULL |
2004-01-01 |
C |
NULL |
2004-01-02 |
A |
NULL |
2004-01-02 |
B |
7 |
2004-01-02 |
C |
NULL |
2004-01-03 |
A |
6 |
2004-01-03 |
B |
7 |
2004-01-03 |
C |
9 |
2004-01-04 |
A |
NULL |
2004-01-04 |
B |
NULL |
2004-01-04 |
C |
NULL |
要求:对 company 相同的记录,从前往后处理每组数据,首先删除记录直到遇到第一个 column3 非 NULL 的记录;再把后续等于 NULL 的 column3 改为前面非 NULL 的值,直到遇到下一个非 NULL 的值,然后继续本过程。
date |
company |
column3 |
2004-01-01 |
A |
5 |
2004-01-02 |
A |
5 |
2004-01-02 |
B |
7 |
2004-01-03 |
A |
6 |
2004-01-03 |
B |
7 |
2004-01-03 |
C |
9 |
2004-01-04 |
A |
6 |
2004-01-04 |
B |
7 |
2004-01-04 |
C |
9 |
编写SPL代码
1 |
=post1.query("select * from tb order by company,date") |
2 |
=A1.run(if( company==company[-1], column3=ifn(column3,column3[-1]))) |
3 |
return A1.select(column3).sort(date) |
A1:通过JDBC查询数据库,按company、date排序。
A2:处理每条记录:同组记录时,如果本行的 column3 非 null 则不修改,为 null 则改为上一条。
A3:再选出 column3 非 null 的记录,按 date 排序,返回结果。
Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
问题来源:https://stackoverflow.com/questions/21839856/delete-null-values-until-first-value-is-not-null
英文版 https://c.scudata.com/article/1725505444019