SQL子查询返回排名2

时间:2015-03-03 01:04:46

标签: sql

我有一个关于在Microsoft T-SQL中编写子查询的问题。从原始表中我需要返回拥有第二大宠物的人的姓名。我能够编写一个返回每个人的perts数量的查询,但是我不确定如何写一个子查询来返回排名#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      | 
+—————————-——+—————-———+

4 个答案:

答案 0 :(得分:0)

ANSI标准方法是:

OFFSET 1 FETCH FIRST 1 ROW ONLY

但是,大多数数据库都有自己的语法,使用limittoprownum。你没有指定数据库,所以我坚持使用标准。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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()