如何在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
相关产品推荐
相关产品推荐

