求助:在SQL Server中提取各Marker最新版本数据的SQL查询方案
保留每个Marker最新版本记录的SQL查询(SQL Server)
针对你的需求,这里提供两种适用于Microsoft SQL Server的解决方案,均可实现仅保留每个Marker对应最新版本的所有数据:
方法1:使用窗口函数(推荐)
窗口函数可直接在分组内对版本排序,轻松筛选出最新版本的所有记录,尤其适合同一Marker存在多条相同最新版本的场景:
SELECT Marker, Version, Value FROM ( SELECT Marker, Version, Value, -- 按Marker分组,每组内按Version降序排名 RANK() OVER (PARTITION BY Marker ORDER BY Version DESC) AS version_rank FROM YourTableName ) ranked_data WHERE version_rank = 1;
说明
RANK()函数会给同一Marker下的最新版本记录都标记为1(比如示例中Marker3的3条001版本记录),不会遗漏任何同版本数据。- 如果你的
Version字段是数值类型而非字符串,直接排序即可;如果是字符串但格式不规则,可转换为数值后排序,比如ORDER BY CAST(Version AS INT) DESC。
方法2:子查询关联
先通过子查询找出每个Marker的最大版本,再关联原表筛选对应记录:
SELECT t.Marker, t.Version, t.Value FROM YourTableName t INNER JOIN ( -- 找出每个Marker的最新版本 SELECT Marker, MAX(Version) AS LatestVersion FROM YourTableName GROUP BY Marker ) latest_versions ON t.Marker = latest_versions.Marker AND t.Version = latest_versions.LatestVersion;
说明
- 这种方法逻辑直观,适合简单场景。如果
Version是字符串且需要按数值排序,子查询中的MAX(Version)要改为MAX(CAST(Version AS INT)),同时关联条件也要对应转换。
注意事项
- 请将代码中的
YourTableName替换为你实际使用的数据表名称。 - 确保
Version字段的排序逻辑符合你的业务需求,比如固定长度的数字字符串(如001、002)按字典序排序即可,非固定长度则需转换为数值类型。
内容的提问来源于stack exchange,提问作者Nsheetz
相关产品推荐
相关产品推荐

