SQL MAX(COUNT(*))GROUP BY替代方法?

时间:2018-11-26 13:25:36

标签: sql sql-server tsql

我见过很多与此相关的主题,而这些主题都不是我想要的。
假设我们有一个简单的表格:

CREATE TABLE A ( 
    id INT, 
    date DATETIME
);

我想在分组后检索MAX值。 因此,我按如下操作:

DECLARE @tmpTable TABLE(id INT, count INT);
INSERT INTO @tmpTable SELECT id, COUNT(*) FROM A GROUP BY id;
SELECT MAX(count) FROM @tmpTable;

有更好的方法吗? 我在阅读一本书时看到了一个解决方案,他们正在这样做,如下所示:

SELECT MAX(count) FROM (SELECT COUNT(*) AS count FROM A GROUP BY id);

但是这不起作用:/是否可以在更新的T-SQL服务器中工作?目前,我正在使用2008 R2。

3 个答案:

答案 0 :(得分:5)

您可以使用TOP

SELECT TOP 1 Id,COUNT(*) AS MAXCOUNT
FROM A
GROUP BY Id
ORDER BY MAXCOUNT DESC

如果您希望结果具有相同的最大计数,请使用TOP WITH TIES

SELECT TOP 1 WITH TIES Id,COUNT(*) AS MAXCOUNT
FROM A
GROUP BY Id
ORDER BY MAXCOUNT DESC

答案 1 :(得分:2)

  

有更好的方法吗?

我们可以尝试使用解析函数:

WITH cte AS (
    SELECT id, COUNT(*) cnt, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) rn
    FROM A
    GROUP BY id
)

SELECT cnt
FROM cte
WHERE rn = 1;

此方法是在原始聚合查询期间,按id生成一个行号,该行号按计数降序排列。那么,具有最高计数的id应该是第一条记录(即使为最高计数绑定了多个id,该结果也应保持有效)。

关于原始的最大查询,请查看@apomene的答案,而您只是缺少别名。

答案 2 :(得分:1)

您还需要为您的子查询添加别名。试试:

SELECT MAX(sub.count1) FROM (SELECT COUNT(*) AS count1 FROM A GROUP BY id) sub;