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查询数据库,按companydate排序

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