SQL查询:如何获取Id对应下version、Date均最新的数据行?
获取每个Id下Version最新且Date最新的行
下面提供几种实用的SQL实现方式,适配不同数据库场景:
方法1:窗口函数(推荐)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用ROW_NUMBER()是最直观的方案。按Id分组后,先按version倒序排(最新版本在前),同版本下再按Date倒序排,最后取每组的第一行即可:
SELECT Id, Name, version, Date FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY version DESC, Date DESC) AS row_num FROM your_table ) AS ranked_table WHERE row_num = 1;
方法2:子查询关联
通过子查询先找出每个Id对应的最大version,再在该version范围内找出最大Date,最后关联原表拿到完整数据:
SELECT t1.* FROM your_table t1 INNER JOIN ( SELECT Id, MAX(version) AS latest_version, MAX(Date) AS latest_date FROM your_table GROUP BY Id, version HAVING version = (SELECT MAX(version) FROM your_table t2 WHERE t2.Id = your_table.Id) ) t2 ON t1.Id = t2.Id AND t1.version = t2.latest_version AND t1.Date = t2.latest_date;
方法3:NOT EXISTS 条件判断
用NOT EXISTS直接判断:当前行是同一Id下,没有比它version更新,或者version相同但Date更新的行,那它就是我们要的目标行:
SELECT t1.* FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Id = t1.Id AND (t2.version > t1.version OR (t2.version = t1.version AND t2.Date > t1.Date)) );
内容的提问来源于stack exchange,提问作者Yash Depani
相关产品推荐
相关产品推荐

