我见过很多与此相关的主题,而这些主题都不是我想要的。
假设我们有一个简单的表格:
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。
答案 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;