用于查找第一个,第二个和第三个最高数字的SQL查询

时间:2009-08-21 08:09:52

标签: asp.net sql sql-server

使用SQL Server从数据库表中检索第一个,第二个和第三个最大数字的示例查询是什么?

7 个答案:

答案 0 :(得分:9)

您可以按降序排序,然后选择前三名。

SELECT TOP 3 YourVal FROM YourTable ORDER BY YourVal DESC

答案 1 :(得分:2)

或者,如果您希望每个结果分开,

第一个号码:

SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC

第二个号码:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC

第三个数字:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 2 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC

假设YourVal是唯一的


编辑:跟随OP评论

获取第n个值,选择不在TOP(n-1)中的TOP 1,因此第五个可以选择:

SELECT TOP 1 YourVal FROM YourTable 
WHERE YourVal not in (SELECT TOP 4 YourVal FROM YourTable ORDER BY YourVal DESC)
ORDER BY YourVal DESC

答案 2 :(得分:1)

建议的SELECT TOP n ... ORDER BY key会起作用,但是如果您要排序的列不是唯一的,则需要注意这样一个事实,即您可能会得到意外的结果。查找有关here主题的更多信息。

答案 3 :(得分:1)

Sudhakar,

对于其中一些问题,可能更容易使用ROW_NUMBER()或DENSE_RANK()。例如,要按照YourVal DESC的顺序查找第五行中的YourVal和其他列:

WITH TRanked AS (
  SELECT *,
    ROW_NUMBER() OVER (
      ORDER BY YourVal DESC, yourPrimaryKey
    ) AS rk
)
  SELECT YourVal, otherColumns
  FROM TRanked
  WHERE rk = 5;

如果您希望所有行具有第五大不同的YourVal值,只需将ROW_NUMBER()更改为DENSE_RANK()。

这些功能的一个非常大的优势是,您可以立即将“第n个最高的YourVal”查询更改为“第n个最高的YourVal 相互之间的列 “只需将PARTITION BY otherColumn添加到OVER子句中即可进行查询。

答案 4 :(得分:1)

在某些DBMS包中,top命令可能不起作用。那怎么办呢?假设我们需要在员工表中找到第三大薪水。因此,我们从表中按降序选择不同的薪水:

select distinct salary from employee order by salary desc

现在,在我们选择的工资中,我们需要前3名工资,我们写道:

select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary

按升序排列前3名工资。这使得第三大薪水进入第一的位置。现在我们的最终任务是打印第三大数字。

select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary) where rownum=1

这是第三大数字。对于查询中的任何错误,请告诉我。基本上要获得第n个最大数字,我们可以将上述查询重写为

select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=**n** order by salary) where rownum=1

答案 5 :(得分:0)

如果您有一个名为Orders的表和3列Id,ProductId和Quantity,那么要检索查询的前3个最高数量:

SELECT TOP 3 [Id], [ProductId], [Quantity] FROM [Orders] ORDER BY [Quantity] DESC

或者如果您只想要数量列:

SELECT TOP 3 [Quantity] FROM [Orders] ORDER BY [Quantity] DESC

答案 6 :(得分:0)

这是完美的!

select top 1 * from Employees where EmpId in 
(
    select top 3 EmpId from Employees order by EmpId
) order by EmpId desc;

如果您想获得第二,第三或第四高,只需将top3更改为适当的数字。