2010-12-19 75 views

回答

18
 
SELECT * 
FROM (
    SELECT some_column, 
     row_number() over (order by your_sort_column desc) as row_num 
    FROM some_table 
) t 
WHERE row_num = 3 


如果您预计多行有在your_sort_column您还可以使用秩()函数

 
SELECT * 
FROM (
    SELECT some_column, 
     rank() over (order by your_sort_column desc) as row_rank 
    FROM some_table 
) t 
WHERE row_rank = 3 
这migh返回多行相同的值..

+1

+1:只有警告是分析功能支持9i +。根据需要,DENSE_RANK可能是比RANK更好的选择。 – 2010-12-19 19:28:33

+0

不正确。分析功能在8i中可用:http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/function.htm#81409。但8i和9i无论如何都是不支持的。所以没有理由发表回答涵盖这些版本,如果没有明确提到 – 2010-12-19 21:18:18

0

可以ORDER BY column name然后LIMIT 1,1拿到第二个

编辑

哎呀,没有看到甲骨文标签,对不起。
ORDER BY column name WHERE ROWNUM = 2应该会更好。

+1

Oracle不支持限制。 – Ronnis 2010-12-19 14:27:13

+0

@Ronnis whooops你是对的,更新回答 – Agos 2010-12-19 14:32:51

+2

“WHERE ROWNUM = 2”永远不会返回任何行。 – 2010-12-19 14:58:49

0
SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (
    SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal 
); 

用您所需的数字替换&N。例如,2会给你第二大薪水。

如果您使用PL/SQL,只需执行该语句即可。它会提示N.

3

我认为下面的查询将用于找到NOT IN中的第二高记录。

SELECT MAX(userId)FROM表WHERE userId NOT IN(SELECT MAX(userId)FROM表)

简单实用...

1

为了得到第二大的薪水使用本:

select salary from 
    (select s2.salary,rownum rm from 
    (select distinct salary from employees order by salary desc) 
    s2 where rownum<=2) 
where rm >= 2 
+0

完美的作品,但我仍然不明白为什么查询不起作用后修改如下 修改: 选择s2.salary,rownum rm从 (select distinct员工薪水按工资desc计算) s2其中rm <= 2 – Abilash 2012-11-26 05:27:53

6

可以使用下面的查询

SELECT * FROM TableName a WHERE 
n = (SELECT count(DISTINCT(b.ColumnName)) 
FROM TableName b WHERE a.ColumnName <=b.ColumnName); 
+2

欢迎使用Stack Overflow!感谢您发布您的答案!请务必仔细阅读[自助推广常见问题](http://stackoverflow.com/faq#promotion)。另请注意,每次链接到您自己的网站/产品时,您都必须*发布免责声明。 – 2013-01-23 06:29:11

1

它适用于第二高的薪水找到列第n个最大值,

$query = "SELECT * FROM `table_name` ORDER BY field_name` DESC LIMIT 1 , 1 "; 
0

试试这个,

SELECT Sal FROM Tab ORDER BY Sal DESC LIMIT 2,1 
+0

查询MySql ... – gifpif 2016-06-16 12:50:27

0

试试这个:

SELECT DISTINCT TOP 3 id,[Password] 
FROM Users_changepassword 
WHERE [UserId] = 3 
ORDER BY id DESC 
+0

nice ans thanksssssssssssssssssssssssssssssssssssss – user2326989 2015-04-27 10:15:22

+0

这不适用于Oracle。 – 2015-08-19 18:53:07

0

你可以试试这个SQL其中的Oracle SQL的ROW_NUMBER()函数用于

select column_name from (
select column_name , 
row_number() over (order by column_name desc) as row_num 
from table_Name) tablex 
where row_num =3 
0
SELECT MAX(Salary) FROM Employee 
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee) 
0

您可以通过使用CONNECT BY PRIOR

CREATE TABLE t(i INT, sal INT); 
INSERT INTO t(i, sal) 
SELECT 1,100 FROM dual UNION 
SELECT 2,100 FROM dual UNION 
SELECT 3,200 FROM dual UNION 
SELECT 4,500 FROM dual UNION 
SELECT 5,1000 FROM dual; 

查询:

SELECT level, MAX(sal) AS sal 
FROM t 
--WHERE level = 2 -- set position here 
CONNECT BY prior sal > sal 
GROUP BY level 
ORDER BY level; 

DBFiddle Demo

DBFiddle Demo2


编辑:

第二方法是使用NTH_VALUE解析函数:

SELECT DISTINCT NTH_VALUE(sal, 2) OVER(ORDER BY sal DESC 
     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
FROM t; 

DBFiddle Demo3