返回秩2的SQL子查询

返回秩2的SQL子查询,sql,Sql,我有一个关于在Microsoft T-SQL中编写子查询的问题。从原始表中,我需要返回宠物数量第二多的人的姓名。我可以编写一个查询,返回每个人的PERT数量,但我不知道如何编写一个子查询来返回排名#2 原始表格: +—————————-——+———-————-+ | Name | Pet | +————————————+————-————+ | Kathy | dog | | Kathy | cat | | Nick |

我有一个关于在Microsoft T-SQL中编写子查询的问题。从原始表中,我需要返回宠物数量第二多的人的姓名。我可以编写一个查询,返回每个人的PERT数量,但我不知道如何编写一个子查询来返回排名#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
但是,大多数数据库对此都有自己的语法,使用
limit
top
rownum
。您没有指定数据库,因此我坚持使用标准。

您使用的是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

如果它们具有相同的列组,这将返回多行。如果您只想返回一行,您可以将RANK()替换为row_NUMBER()

顺便问一下,您的RDBMS是什么?如果两个主人的宠物数量最多,那么下一个要返回吗?如果有几个第二位呢?如果您使用的是MS SQL Server,您可以使用它来分配rownumber,然后选择row=2。@Guranjanning:是的,我了解您的方法,但不确定如何将其作为现有查询的子查询来实现。@PixelPaul请参阅我的用法答案。