这样使用HAVING子句对吗?

时间:2019-02-04 01:29:14

标签: sql

如果我按属性a将关系分组,然后我这样做:

GROUP BY a

HAVING count(a) < max(a)

这是正确的方法吗? (我需要使关系中出现的a小于最大a do的值)

2 个答案:

答案 0 :(得分:0)

不,不是(根据您对所需物品的描述)。

在执行GROUP BY之后,拥有子集是一种方法。

计数似乎无关紧要...您提供的条件将为每个值创建一个存储桶,并返回其中项数小于该值的存储桶。 因此,在您的示例中,如果您的行包含值1,1,2,并执行SELECT a FROM ... GROUP BY a WHERE COUNT(a) < MAX(a),则结果将为2(因为1出现两次,并且等于2,不小于2)。

您可能想对所描述的内容使用sub select:

SELECT ... FROM ... WHERE a < (SELECT MAX(a) FROM ...)

但是,您的描述不是那么具体,所以希望对您有所帮助。

答案 1 :(得分:0)

在语法上,这是正确的。但这并不能满足您的要求。 max(a)正在计算a的最大值-与计数无关。

如果您关心计数,我建议使用窗口功能:

select x.*
from (select a, count(*) as cnt, . . .,
             rank() over (order by count(*) desc) as seqnum
      from . . .
      group by a
     ) x
where seqnum > 1;

这也可以通过having子句来实现:

select a, count(*) as cnt, . . .
from . . .
group by a
having count(*) < (select count(*)
                   from . . .
                   group by a
                   order by count(*) desc
                   fetch first 1 row only
                  );

这两个查询都使用ISO / ANSI标准语法,因为您的问题没有数据库标记。