web-dev-qa-db-ja.com

テーブルから2番目または3番目に大きいエントリを取得する方法

OracleでテーブルからN番目に大きいエントリを見つける方法を教えてもらえますか?

私たちが使用できる最大のものと同様MAX(column_name)n番目に大きいものを見つけるための効率的な方法はありますか

11
Ninja
 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で同じ値が複数の行にあると予想される場合は、rank()関数も使用できます

 SELECT * 
 FROM(
 SELECT some_column、
 rank()over(order by your_sort_column desc)as row_rank 
 FROM some_table 
)t 
 WHERE row_rank = 3 
23

次のクエリを使用して、列のn番目に大きい値を見つけることができます

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

以下のクエリは、NOT INを使用して2番目に高いレコードを見つけるのに役立ちます。

SELECT MAX( userId)FROMテーブルWHERE userId NOT IN(SELECT MAX(userId)FROM table)</ code>

シンプルで便利な...

4
prakash

2番目に高い給与で機能し、

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

2番目に大きな給与を取得するには、次のようにします。

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
1
Sanjeev Yadav
SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (
  SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal
);

置換&Nご希望の番号で。例えば、 2は、2番目に高い給与になります。

PL/SQLを使用している場合は、ステートメントを実行するだけです。 Nを要求します。

0
Kishore Kumar

これを試して:

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

Oracle SQLのRow_number()関数が使用されているこのSQLを試すことができます

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
UserszrKs
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
0
Piyush

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


編集:

2番目のアプローチは、NTH_VALUE分析関数:

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

DBFiddle Demo

0
Lukasz Szozda

これを試して、

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

あなたはできる ORDER BY column name その後 LIMIT 1,1 2番目のものを取得する

編集

申し訳ありませんが、Oracleタグが表示されませんでした。
ORDER BY column name WHERE ROWNUM = 2のほうがうまくいくはずです。

0
Agos