2015-03-03 46 views
2

我有一個關於在Microsoft T-SQL中編寫子查詢的問題。從原始表中,我需要返回第二大寵物的人的姓名。我能夠編寫一個查詢返回每人的perts數量,但我不確定如何編寫一個子查詢返回排名#2。SQL子查詢返回等級2

原始表:

+—————————-——+———-————-+ 
| Name  | Pet | 
+————————————+————-————+ 
| Kathy  | dog | 
| Kathy  | cat | 
| Nick  | gerbil | 
| Bob  | turtle | 
| Bob  | cat | 
| Bob  | snake | 
+—————————-——+—————-———+ 

我有以下查詢:

SELECT Name, COUNT(Pet) AS NumPets 
FROM PetTable 
GROUP BY Name 
ORDER BY NumPets DESC 

將返回:

+—————————-——+———-————-+ 
| Name  | NumPets | 
+————————————+————-————+ 
| Bob  | 3  | 
| Kathy  | 2  | 
| Nick  | 1  | 
+—————————-——+—————-———+ 
+0

你的RDBMS的方式是什麼? – potashin 2015-03-03 01:08:03

+2

如果2個所有者擁有最大數量的寵物 - 是下一個要歸還的寵物嗎?如果有幾個第二名的地方呢? – zerkms 2015-03-03 01:10:35

+0

如果您使用的是MS SQL Server,則可以使用['ROW_NUMBER'](https://msdn.microsoft.com/en-us/library/ms186734.aspx)分配rownumber,然後選擇row = 2。 – 2015-03-03 01:15:29

回答

0

您正在使用TSQL所以:

WITH C AS (
    SELECT COUNT(Pet) OVER (PARTITION BY Name) cnt 
      ,Name 
    FROM PetTable 
) 
SELECT TOP 1 Name, cnt AS NumPets 
FROM C 
WHERE cnt = 2 
0

ANSI標準方法是:

OFFSET 1 FETCH FIRST 1 ROW ONLY 

但是,大多數數據庫都有自己的語法,使用limit,toprownum。你不指定數據庫,所以我堅持使用標準。

0

這是你如何使用ROW_NUMBER得到結果。

SELECT * 
FROM(
SELECT ROW_NUMBER() OVER (ORDER BY COUNT(name) DESC) as RN, Name, COUNT(NAME) AS COUNT 
FROM PetTable 
GROUP BY Name 
) T 
WHERE T.RN = 2 
0

在MSSQL中,你可以這樣做:

SELECT PetCounts.Name, PetCounts.NumPets FROM (
    SELECT 
    RANK() OVER (ORDER BY COUNT(Pet) DESC) AS rank, 
    Name, COUNT(Pet)as NumPets 
    FROM PetTable 
    GROUP BY Name 
) AS PetCounts 
WHERE rank = 2 

這將返回多行,如果它們具有相同的等級。如果你想只返回一行,你可以用ROW_NUMBER()替換RANK()