2016-10-03 177 views
0

我有一个SQLAnywhere的表是这样的:SQL汇总最新的非空列值

id  int   not null, 
inserted datetime not null, 
modified datetime not null, 
data1  varchar(20)  null 
data2  varchar(20)  null 

开发商没有把一个唯一索引上的ID,现在有一帮行与同但行之间的data1和data2的值不同,包括一些空值。我需要解决这个问题,使用最早插入时间,最新修改时间和最新(修改时间)将具有相同ID的所有行滚动到新表中的单个行中。非null data1的值和data2(除非该id的所有行都为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

我会用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 
+0

完美!谢谢杰里米。 – alacrity