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我已更新了答案以检索第二个结果谢谢!我从来不知道有领带的
!似乎是另一种简单易行的方法:)