SQL如何按workstation、Branch、inits分组查询各组最新创建记录
解决思路
你需要用窗口函数实现分组取TOP N的需求,针对你的场景(每个workstation/Branch/Inits分组取最新1条记录),推荐使用ROW_NUMBER()窗口函数实现,这是SQL领域处理这类需求的通用方案。
可直接复用的SQL示例
SELECT workstation, branch, Inits, document, [DateTime] FROM ( -- 内层查询给每个分组的记录按时间倒序打序号 SELECT workstation, branch, Inits, document, [DateTime], ROW_NUMBER() OVER ( PARTITION BY workstation, Branch, Inits -- 按你需要的三个字段分组 ORDER BY [DateTime] DESC -- 组内按创建时间倒序,最新的排第一 ) AS rn FROM iheads (nolock) WHERE Inits = 'AAADB' AND [datetime] >='2021-11-01 23:53:00.000' AND [datetime] <= '2021-11-30 23:58:00.000' ) t WHERE rn = 1 -- 只取每个分组排名第一的最新记录 ORDER BY Workstation DESC
说明
- 如果你要调整分组维度,只需要修改
PARTITION BY后面的字段即可 - 如果同一个分组下存在多条完全相同时间的记录,
ROW_NUMBER()会随机给其中一条标为1,如果你要保留所有同时间的最新记录,可以把ROW_NUMBER()换成RANK() - 你调试完成后删除
document字段、替换WHERE条件为动态参数即可,不需要调整核心逻辑 - 你之前用
TOP 1只返回全局1条、GROUP BY报错是因为普通GROUP BY要求所有非聚合字段都出现在GROUP BY列表里,没法直接取对应最新时间的其他字段,窗口函数刚好解决了这个场景的问题
内容的提问来源于stack exchange,提问作者Magoo
相关产品推荐
相关产品推荐

