56

我想用出现数选择不同的键,这个查询似乎是有效的:

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
ORDER BY count(*) desc;

但我也想过滤这些结果,这意味着我只想要 count(*) 大于 2500 的地方,所以只会显示大于 2500 的出现,但是:

SELECT * 
FROM 
(
    SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
    FROM ItemMetaData 
    GROUP BY ItemMetaData.KEY 
    ORDER BY count(*) desc
) as result WHERE count(*)>2500;

不幸的是,此查询导致语法错误。你能帮我实现我的要求吗?

4

4 回答 4

106

聚合的 HAVING 子句

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
Group By ItemMetaData.KEY, ItemMetaData.VALUE
HAVING count(*) > 2500
ORDER BY count(*) desc;
于 2012-07-09T15:04:24.673 回答
15

您应该使用havingwith 组函数而不是where. 例如:

select ..., count(*) from ... group by ... having count(*) > 2500;
于 2012-07-09T15:04:29.993 回答
8

您不需要使用子查询 - 只需使用having子句而不是where子句来按聚合列进行过滤。

SELECT
ItemMetaData.KEY, ItemMetaData.VALUE, count(*)
FROM ItemMetaData
GROUP BY ItemMetaData.KEY
HAVING count(*) > 2500
ORDER BY count(*) desc
于 2012-07-09T15:04:43.567 回答
4

解释如下:WHERE子句在单个行上引入条件;HAVING子句引入了聚合条件。

WHERE前后使用。GROUP BY_ HAVING_ GROUP BY这不是强制性的,但在大多数情况下很有帮助。

SELECT 
       ItemMetaData.KEY, ItemMetaData.VALUE, СOUNT(*) 
FROM  ItemMetaData 
GROUP BY
       ItemMetaData.KEY, ItemMetaData.VALUE
HAVING СOUNT(*) > 2500
ORDER BY СOUNT(*) DESC;
于 2017-08-23T09:16:59.660 回答