簡體   English   中英

SQL子查詢返回排名2

[英]SQL subquery to return rank 2

我有一個關於在Microsoft T-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      | 
+—————————-——+—————-———+

ANSI標准方法是:

OFFSET 1 FETCH FIRST 1 ROW ONLY

但是,大多數數據庫對此都有自己的語法,使用limittoprownum 您沒有指定數據庫,所以我堅持使用標准。

您正在使用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

這樣便可以使用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

在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM