SQL Server 2017中使用HAVING子句时如何避免GROUP BY
替代GROUP BY的实现方案
首先需要说明:你的原查询存在SQL规范问题——SELECT *与GROUP BY ST_ID搭配不符合ANSI SQL标准(仅部分数据库在宽松模式下允许),因为GROUP BY后只能选择分组列或聚合函数计算的列。下面针对你的实际需求(筛选ST_ID=86且DATE__CALC为空的记录中,该ST_ID的最大修改时间早于当前时间的情况),提供两种无需GROUP BY的实现方式:
方案一:使用窗口函数(推荐)
窗口函数可以在不分组的前提下计算每个ST_ID的最大修改时间,之后再筛选条件:
需求1:仅确认该ST_ID是否符合条件(返回ST_ID)
SELECT DISTINCT ST_ID FROM [database].[W_work] WHERE DATE__CALC IS NULL AND ST_ID = 86 AND MAX(modification_date) OVER (PARTITION BY ST_ID) < GETDATE()
需求2:返回该ST_ID下所有DATE__CALC为空的记录(且满足最大修改时间条件)
SELECT * FROM ( SELECT *, MAX(modification_date) OVER (PARTITION BY ST_ID) AS max_modification_date FROM [database].[W_work] WHERE DATE__CALC IS NULL AND ST_ID = 86 ) AS sub_query WHERE max_modification_date < GETDATE()
方案二:使用EXISTS子查询
通过子查询验证该ST_ID的最大修改时间条件,外层查询返回目标记录:
SELECT * FROM [database].[W_work] w WHERE DATE__CALC IS NULL AND ST_ID = 86 AND EXISTS ( SELECT 1 FROM [database].[W_work] w2 WHERE w2.ST_ID = w.ST_ID AND w2.DATE__CALC IS NULL HAVING MAX(w2.modification_date) < GETDATE() )
内容的提问来源于stack exchange,提问作者Hbade
相关产品推荐
相关产品推荐

