2010-12-19 97 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

相關問題