这个问题很旧,但是在dba.SE的一个新问题中被引用。我觉得还没有提供最好的解决方案,所以我要添加另一个解决方案。
首先,假设参照完整性(通常与外键约束强制)你不需要加入到表在所有。这是您查询中的固定费用。到目前为止,所有答案都没有指出这一点。movie
我可以用max(count(*))
SQL做吗?
要回答标题中的问题:是,在Postgres 8.4(在发布此问题之前,于2009-07-01发布)中或更高版本中,您可以通过将聚合函数嵌套在window函数中来实现:
SELECT c.yr, count(*) AS ct, max(count(*)) OVER () AS max_ct
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr;
考虑SELECT
查询中的事件顺序:
(可能的)缺点:窗口函数不聚合行。在聚合步骤之后,您将剩下所有行。在某些查询中很有用,但不适用于此查询。
为了得到一个排最高的数量,你可以使用ORDER BY ct LIMIT 1
像@wolph暗示:
SELECT c.yr, count(*) AS ct
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr
ORDER BY ct DESC
LIMIT 1;
仅使用任何中途的RDBMS中可用的基本SQL功能-LIMIT
实现有所不同:
或者,您可以使用(仅Postgres)在每个组中获得最高计数的一行DISTINCT ON
:
回答
但您要求:
... count(*)最大的行
可能不止一个。最优雅的解决方案是在子查询中使用window函数rank()
。Ryan提供了一个查询,但是它可以更简单(在我上面的回答中有详细信息):
SELECT yr, ct
FROM (
SELECT c.yr, count(*) AS ct, rank() OVER (ORDER BY count(*) DESC) AS rnk
FROM actor a
JOIN casting c ON c.actorid = a.id
WHERE a.name = 'John Travolta'
GROUP BY c.yr
) sub
WHERE rnk = 1;
如今,所有主要的RDBMS支持窗口功能。除了MySQL和forks(MariaDB似乎终于在10.2版中实现了它们)。