SQL Server中按名称取last_modify_date最大值,避免使用GROUP BY
解决方案:使用窗口函数获取每个name的最新记录
要避免使用GROUP BY同时获取每个name对应的最新last_modify_date记录,窗口函数是最优方案,无需重复列出所有30列。
具体查询语句
SELECT name, [value] AS v, last_modify_date FROM ( SELECT name, [value], last_modify_date, ROW_NUMBER() OVER (PARTITION BY name ORDER BY last_modify_date DESC) AS rn FROM MyTable ) AS sub WHERE rn = 1;
逻辑说明
PARTITION BY name:将数据按name分组,每组单独处理ORDER BY last_modify_date DESC:在每个分组内,按last_modify_date倒序排列,最新的记录排在最前面ROW_NUMBER():为每个分组内的记录分配行号,最新的记录行号为1- 外层查询筛选行号
rn = 1的记录,即可得到每个name的最新数据
针对测试数据的执行结果
name | v | last_modify_date ------------------------------- Example1 | 100 | 2024-01-03 12:00:00 Example2 | 100 | 2024-01-02 18:00:00 Example3 | 100 | 2024-01-02 12:00:00
扩展说明
如果存在同一name多条记录拥有相同的最大last_modify_date,可以改用RANK()或DENSE_RANK()替代ROW_NUMBER(),这样会保留所有同最新日期的记录:
SELECT name, [value] AS v, last_modify_date FROM ( SELECT name, [value], last_modify_date, RANK() OVER (PARTITION BY name ORDER BY last_modify_date DESC) AS rn FROM MyTable ) AS sub WHERE rn = 1;
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

