SQL Server多列分组聚合,获取最大值及关联字段的查询构建求助
解决SQL Server中获取参数-位置组合最大Report_Result对应行的问题
嘿,我来帮你搞定这个查询需求!针对你说的要获取每个唯一PARAMETER_NAME + GW_LOCATION_ID组合下Report_Result最大值对应的行(包含DETECT_FLAG和其他字段),用SQL Server的窗口函数是最简洁高效的方案,下面给你具体实现和说明:
方法一:获取唯一最大值行(无并列时用)
如果每个参数-位置组合里Report_Result的最大值只有一行,用ROW_NUMBER()窗口函数就可以:
WITH RankedResults AS ( SELECT PARAMETER_NAME, GW_LOCATION_ID, Report_Result, DETECT_FLAG, -- 替换成你需要返回的其他字段 Your_Other_Field1, Your_Other_Field2, -- 按参数和位置分组,对结果值降序排名 ROW_NUMBER() OVER ( PARTITION BY PARAMETER_NAME, GW_LOCATION_ID ORDER BY Report_Result DESC ) AS ResultRank FROM Your_Table_Name -- 替换成你的实际表名 ) SELECT PARAMETER_NAME, GW_LOCATION_ID, Report_Result, DETECT_FLAG, Your_Other_Field1, Your_Other_Field2 FROM RankedResults WHERE ResultRank = 1;
方法二:返回所有并列最大值行(有并列时用)
如果存在多个行的Report_Result都是该组合下的最大值,想要全部返回的话,把ROW_NUMBER()换成RANK()即可:
WITH RankedResults AS ( SELECT PARAMETER_NAME, GW_LOCATION_ID, Report_Result, DETECT_FLAG, Your_Other_Field1, Your_Other_Field2, -- RANK()会给并列最大值相同的排名 RANK() OVER ( PARTITION BY PARAMETER_NAME, GW_LOCATION_ID ORDER BY Report_Result DESC ) AS ResultRank FROM Your_Table_Name ) SELECT PARAMETER_NAME, GW_LOCATION_ID, Report_Result, DETECT_FLAG, Your_Other_Field1, Your_Other_Field2 FROM RankedResults WHERE ResultRank = 1;
逻辑说明
- CTE(公共表表达式)
RankedResults里,我们用PARTITION BY PARAMETER_NAME, GW_LOCATION_ID把数据按参数-位置组合分组; - 用
ORDER BY Report_Result DESC让每个组内的行按结果值从大到小排序; - 最后筛选出排名为1的行,就是每个组合下结果值最大的那一行(或所有并列行)。
记得把代码里的Your_Table_Name和Your_Other_Field1/2替换成你实际的表名和需要返回的字段哦!
内容的提问来源于stack exchange,提问作者Casivio
相关产品推荐
相关产品推荐

