如何在不新增GROUP BY列的情况下获取结构最新巡检完整数据
解决方案
以下是两种可靠的实现方式,均可保证每个结构仅返回一行最新巡检记录:
方法1:窗口函数(推荐,兼容性强)
利用ROW_NUMBER()窗口函数给每个结构的巡检记录按日期倒序排名,直接筛选排名第一的记录(即最新巡检条目):
WITH RankedInspections AS ( SELECT s.*, i.InspectionDate, i.StructureIndex, i.Urgency, -- 按结构分组,巡检日期倒序排序,最新记录行号标记为1 ROW_NUMBER() OVER (PARTITION BY s.StructureID ORDER BY i.InspectionDate DESC) AS rn FROM TableS s LEFT JOIN TableI i ON s.StructureID = i.StructureID ) SELECT -- 列出Table S需要的所有字段,例如StructureID、Name等 StructureID, InspectionDate, StructureIndex, Urgency FROM RankedInspections WHERE rn = 1;
如果同一结构在同一天有多条巡检记录,可在ORDER BY后追加规则(比如优先取Urgency最高的),示例:ORDER BY i.InspectionDate DESC, i.Urgency DESC。
方法2:关联子查询
先通过子查询获取每个结构的最新巡检日期,再关联回巡检表提取对应字段:
SELECT s.*, i.InspectionDate, i.StructureIndex, i.Urgency FROM TableS s LEFT JOIN TableI i ON s.StructureID = i.StructureID AND i.InspectionDate = ( -- 子查询定位当前结构的最大巡检日期 SELECT MAX(InspectionDate) FROM TableI WHERE StructureID = s.StructureID );
注意:如果同一结构在最新巡检日期存在多条记录,此方法会返回多行,这种场景下优先选用方法1。
额外提示
- 使用
LEFT JOIN会保留Table S中所有结构,无巡检记录的结构对应的巡检字段将显示为NULL;若仅需保留有巡检记录的结构,替换为INNER JOIN即可。 - 确保两张表的关联字段(如
StructureID)匹配正确,避免关联逻辑错误导致结果异常。
内容的提问来源于stack exchange,提问作者ar ia
相关产品推荐
相关产品推荐

