You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:40:25