使用SQL Server从数据库表中检索第一个,第二个和第三个最大数字的示例查询是什么?
答案 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
更改为适当的数字。