SQL汇总最新的非空列值

时间:2016-10-03 00:14:39

标签: sql group-by sybase sqlanywhere rollup

我有一个像这样的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程序?

由于

1 个答案:

答案 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