2017-07-20 126 views
2

我有以下數據MigratoryBirds表中的SQL Server如何獲得SQL Server表

birdType 
1 
4 
4 
4 
5 
5 
5 
3 

SQL腳本創建上表爲最大值的所有記錄:

/****** Object: Table [dbo].[migratoryBirds] Script Date: 20-Jul-17 8:01:02 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[migratoryBirds](
    [birdType] [int] NULL 
) ON [PRIMARY] 

GO 

我的目標是要獲得表中頻率最高的那些鳥類。如果我編寫一個存儲過程並且可以自由地編寫幾個SQL查詢,那麼它並不困難,但我試圖用單個SQL查詢來實現它。我試圖看看SQL Server的Having子句可以對我有什麼幫助。

所以我寫的第一個查詢:

select birdType, count(1) AS [birdCount] 
from migratorybirds 
group by birdType 

這給下面的輸出

birdType birdCount 
1  1 
3  1 
4  3 
5  3 

由於這是聚集的情況下,所以我想Having子句可以幫助我在這裏過濾掉具有最高頻率3的記錄。 birdType 4和5具有最高頻率3.

所以,我提高了我這樣的查詢:

select birdType, count(1) AS [birdCount] 
from migratorybirds 
group by birdType 
having count(1) > Max(count(1)) 

這給下面的錯誤:

Msg 130, Level 15, State 1, Line 18 Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

誰能幫助我實現相同?

回答

5

在SQL Server中,你可以使用top (1) with ties

select top (1) with ties birdType, count(1) AS birdCount 
from migratorybirds 
group by birdType 
order by count(1) desc; 
0

在實踐中,我可能會與戈登的回答去,但如果你想繼續使用當前的方法,你可以嘗試以下方法:

WITH cte AS (
    SELECT birdType, COUNT(1) AS [birdCount] 
    FROM migratorybirds 
    GROUP BY birdType 
) 

SELECT * 
FROM cte 
WHERE birdCount = (SELECT MAX(birdCount) FROM cte) 

如果您想以這種方式使用MAX,則需要WHERE子句中的實際子查詢。請注意,這個解決方案需要兩個查詢,而戈登的答案只需要一個。