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

如何在SQL Server的WHERE子句中使用COUNT函数的统计结果

SQL Server中基于COUNT统计结果过滤分组数据的方法

你不能直接在WHERE子句中使用COUNT(*)的统计结果——因为WHERE是在分组前筛选行,而COUNT(*)是分组后的聚合计算结果。要实现你的需求,需要用**HAVING子句**,它专门用于分组后的条件过滤。

直接使用HAVING的写法

SELECT 
    [id],
    COUNT(*) AS IdCount,
    RANK() OVER (ORDER BY COUNT(*) DESC) CountRank
FROM  
    myTable
WHERE
    DATEDIFF(day, [Time], GETDATE()) < 30 
GROUP BY 
    [id]
HAVING 
    COUNT(*) > 100

用CTE(公共表表达式)优化可读性的写法

如果觉得聚合函数重复写不够清晰,可以先用CTE预处理分组和过滤,再进行排名:

WITH GroupedData AS (
    SELECT 
        [id],
        COUNT(*) AS IdCount
    FROM  
        myTable
    WHERE
        DATEDIFF(day, [Time], GETDATE()) < 30 
    GROUP BY 
        [id]
    HAVING 
        COUNT(*) > 100
)
SELECT 
    [id],
    IdCount,
    RANK() OVER (ORDER BY IdCount DESC) CountRank
FROM GroupedData

关键说明

  • WHERE负责过滤原始数据(这里筛选最近30天的记录),执行时机在分组之前
  • GROUP BY按id分组后计算每个分组的数量
  • HAVING只保留统计数量大于100的分组,执行时机在分组之后
  • 排名函数RANK()可以直接使用聚合函数或CTE中的别名,按统计值排序生成排名

内容的提问来源于stack exchange,提问作者n179911a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:40:57