我有一个像这样的SQLAnywhere表:
id int not null,
inserted datetime not null,
modified datetime not null,
data1 varchar(20) null
data2 varchar(20) null
开发人员没有在id上放置唯一索引,现在有一堆行具有相同的id,但行中的data1和data2的值不同,包括一些空值。我需要解决这个问题,使用最早插入的时间,最新的修改时间和最新的(修改时间)非空 data1和data2的值(除非该id的所有行都为null,在这种情况下,汇总的行值为null)。我不能只使用最后一行;我需要每个列的最新非空值。
这样的三行:
1, '2016-01-01', '2016-01-02', 'first', null
1, '2016-01-05', '2016-01-07', null, 'second'
1, '2016-01-10', '2016-01-12', 'third', null
......会卷起来:
1, '2016-01-01', 2016-01-12', 'third', 'second'
我已经研究过非等自连接和窗口函数,但我不能让它们为各列汇总最新的非空值。有没有一种很酷的SQL方法可以在一个查询中执行此操作,或者是我,为它编写Java程序?
由于
答案 0 :(得分:0)
我会使用LAST_VALUE
。
select
id
,min(inserted) over (partition by id)
,max(modified) over (partition by id)
,last_value(data1 ignore nulls) over (partition by id order by modified)
,last_value(data2 ignore nulls) over (partition by id order by modified)
from
table_a