SQL Server含聚合函数时不使用GROUP BY选取指定字段的咨询
解决方案
你可以使用SQL Server提供的ROW_NUMBER()窗口函数实现需求,无需将额外字段加入GROUP BY子句,即可获取每个分组最新时间戳对应的tcon.Inductive_Injection_Hours、tcon.Capacitive_Injection_Hours字段值。
修改后的查询代码如下:
WITH RankedTelData AS ( SELECT bp.Serial_Number, tcon.Serial_Number AS ConverterSerialNumber, tcon.Time_Stamp AS DateStamp, tcon.Inductive_Injection_Hours, tcon.Capacitive_Injection_Hours, -- 按指定维度分组,组内按时间戳倒序排名,最新记录排名为1 ROW_NUMBER() OVER ( PARTITION BY bp.Serial_Number, tcon.Serial_Number ORDER BY tcon.Time_Stamp DESC ) AS rn FROM dbo.Bypass AS bp INNER JOIN dbo.Converter AS c ON bp.Bypass_ID = c.Bypass_ID INNER JOIN dbo.Converter_Tel_Data AS tcon ON c.Converter_ID = tcon.Converter_ID WHERE bp.Site_ID = 7 ) SELECT Serial_Number, ConverterSerialNumber, DateStamp, Inductive_Injection_Hours, Capacitive_Injection_Hours FROM RankedTelData WHERE rn = 1 ORDER BY ConverterSerialNumber
逻辑说明
- 我们通过公共表表达式(CTE)先给所有匹配的记录做分组排名:
PARTITION BY后填写的就是你需要的分组维度,不需要包含两个小时统计字段 - 组内按
Time_Stamp倒序排序,保证每组内最新时间戳的记录排名为1 - 最后仅筛选排名为1的记录,即可得到每个分组最新时间戳对应的所有字段值,全程不需要使用GROUP BY子句
如果你的业务场景中存在多条完全相同的最大时间戳记录,且需要全部保留,只需要把ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者Sheikh Umair Ahmad
相关产品推荐
相关产品推荐

