sql - 如何编写 SQL 以使用 group by 函数从多行中提取最新的非空数据?
问题描述
我想为 MS SQL 编写 SQL 以提取每个列的最新记录number
这是数据的样子:
这就是我想要的输出:
更新:
另外,如果我更改我的 INSERT 语句并包含 TYPE 列,它会变得更好吗?我可以获取每个 TYPE 的最新记录并运行任何聚合函数(MIN/MAX)吗?:
解决方案
这很棘手。一种方法是使用相关子查询或横向连接:
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;
我不确定这些替代方案中的哪一个会具有更好的性能。
推荐阅读
- python - 使用 Panda 的 Apply 函数在使用 Python 的 Google Places API 查询中循环遍历坐标列表 (csv)
- c - 使用c中的scanf将字符输入到枚举变量中
- html - 如何制作一个将表情符号上传到输入框的按钮?
- angular - 我试图用实时数据填充顶点图表,但它永远不会填充
- python - 如何在 matlab 中为树莓派 4 创建动态 bash 脚本
- python - 嵌套收益率保留每个函数状态
- typescript - 值对象静态工厂
- java - 当类型为 null 或存在默认值时,Kafka 消息字段被嵌套
- npm - 无法安装:Tailwind CSS 自定义表单插件
- amazon-web-services - AWS Cloudformation 上的 UserData 未部署在 EC2 实例上