【问题标题】:SQL rollup latest non-null column valuesSQL 汇总最新的非空列值
【发布时间】:2017-02-10 21:25:27
【问题描述】:

我有一个这样的 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值不同的行跨行,包括一些null。我需要解决这个问题,使用最早插入时间、最新修改时间和最新(按修改时间)non-null,将具有相同 id 的所有行汇总到新表中的单行中> 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'

我查看了非 equi-self-join 和窗口函数,但我无法让它们汇总各个列的最新非空值。有没有一种很酷的 SQL 方法可以在一个查询中执行此操作,还是我,哎呀,为它编写一个 Java 程序?

谢谢

【问题讨论】:

    标签: sql group-by sybase sqlanywhere rollup


    【解决方案1】:

    我会使用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
    

    【讨论】:

    • 完美!谢谢杰里米。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2011-04-17
    • 2013-08-14
    相关资源
    最近更新 更多