如果我按属性a将关系分组,然后我这样做:
GROUP BY a
HAVING count(a) < max(a)
这是正确的方法吗? (我需要使关系中出现的a小于最大a do的值)
答案 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标准语法,因为您的问题没有数据库标记。