首页 > 解决方案 > 如何编写 SQL 以使用 group by 函数从多行中提取最新的非空数据?

问题描述

我想为 MS SQL 编写 SQL 以提取每个列的最新记录number

这是数据的样子:

在此处输入图像描述

这就是我想要的输出:

在此处输入图像描述

更新:

另外,如果我更改我的 INSERT 语句并包含 TYPE 列,它会变得更好吗?我可以获取每个 TYPE 的最新记录并运行任何聚合函数(MIN/MAX)吗?:

在此处输入图像描述

标签: sqlsql-server

解决方案


这很棘手。一种方法是使用相关子查询或横向连接:

select *
from (select distinct number from t) n outer apply
     (select top (1) t2.city
      from t t2
      where t2.number = n.number and t2.city is not null
      order by t2.record_date desc
     ) c outer apply
     (select top (1) t2.region
      from t t2
      where t2.number = n.number and t2.region is not null
      order by t2.record_date desc
     ) r outer apply
     . . .

不幸的是,您必须一次完成这一列。

SQL 标准有一个构造IGNORE NULLS,它可以用来LAG()准确地支持你想要做的事情。

顺便说一下,另一种方法是条件聚合”

select number,
       max(case when seqnum_city = 1 then city end) as city,
       max(case when seqnum_region = 1 then region end) as region,
       . . .
from (select t.*,
             row_number() over (partition by number
                                order by (case when city is not null then 1 else 2 end), record_date desc
                               ) as seqnum_c,
             row_number() over (partition by number
                                order by (case when region is not null then 1 else 2 end), record_date desc
                               ) as seqnum_r,
             . . .
      from t
     ) t
group by number;

我不确定这些替代方案中的哪一个会具有更好的性能。


推荐阅读