SQL MAX(计数(*)按备选方案分组?

SQL MAX(计数(*)按备选方案分组?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我看过很多关于这方面的话题,但没有一个是我想要的。 假设我们有一个简单的表: CREATE TABLE A ( id INT, date DATETIME ); 我想在分组后检索最大值。 因此,我的做法如下: DECLARE @tmpTable TABLE(id INT, count INT); INSERT INTO @tmpTable SELECT id, COUNT(*) FROM A GROUP BY id; SELECT MAX(count) FROM @tmpT

我看过很多关于这方面的话题,但没有一个是我想要的。
假设我们有一个简单的表:

CREATE TABLE A ( 
    id INT, 
    date DATETIME
);
我想在分组后检索最大值。 因此,我的做法如下:

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

有更好的方法吗

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

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
与最高计数并列,该结果也应保持有效)

关于最初的max查询,请参见@apomene的答案,您只是缺少了一个别名

有更好的方法吗

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

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
与最高计数并列,该结果也应保持有效)


关于最初的max查询,请参见@apomene的答案,您只是缺少一个别名。

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

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

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

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

您可以使用
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

您可以使用
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

@TimBiegeleisen。哇,真的不知道。编辑。是的……我总是把不同的数据库搞混了。但是,我同意你的说法,给别名命名
count
通常是不好的:-)该死@阿波美尼接球不错!我有一种感觉:D我应该联系这本书的作者^ ^再次感谢你的提醒@TimBiegeleisen。哇,真的不知道。编辑。是的……我总是把不同的数据库搞混了。但是,我同意你的说法,给别名命名
count
通常是不好的:-)该死@阿波美尼接球不错!我有一种感觉:D我应该联系这本书的作者^ ^再次感谢你的提醒!有趣!我从未使用过解析函数,所以很高兴知道!谢谢分享!:)有趣!我从未使用过解析函数,所以很高兴知道!谢谢分享!:)谢谢分享!我以前已经尝试过这种方法,这种方法唯一的问题是,当你有两个相同计数的记录时,你只会得到第一个。因此,MAX将显示两个结果,即使它们是相同的。@Giladrich我已更新了答案以检索第二个结果谢谢!我从来不知道有领带的
!似乎是另一种简单易行的方法:)谢谢分享!我以前已经尝试过这种方法,这种方法唯一的问题是,当你有两个相同计数的记录时,你只会得到第一个。因此,MAX将显示两个结果,即使它们是相同的。@Giladrich我已更新了答案以检索第二个结果谢谢!我从来不知道有领带的
!似乎是另一种简单易行的方法:)