web-dev-qa-db-ja.com

Oracleでトップ1を獲得するにはどうすればよいですか。

どうすれば次のことができますか?

select top 1 Fname from MyTbl

Oracle 11gに

210
Gold

最初に選択した行だけが必要な場合は、次のことができます。

select fname from MyTbl where rownum = 1

分析関数を使用して、上位xを順序付けして取得することもできます。

select max(fname) over (rank() order by some_factor) from MyTbl
225
mcpeterson
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;

Oracle 12c (2013年6月)では、次のように使用できます。

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
25
MSK

サブクエリの中でROW_NUMBER()ORDER BY節と一緒に使用し、この列をTOP Nの代わりに使用することができます。これは段階的に説明できます。

NAMEDT_CREATEDの2つの列がある下の表を参照してください。

enter image description here

NAMEに関係なく最初の2つの日付だけを取る必要がある場合は、以下のクエリを使用できます。ロジックはクエリ内に書かれています

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
    -- Generates numbers in a column in sequence in the order of date
    SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

_ result _

enter image description here

状況によっては、各NAMEに対応するTOP Nの結果を選択する必要があります。そのような場合、サブクエリでPARTITION BY節と一緒にORDER BYを使うことができます。下記のクエリを参照してください。

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
  --Generates numbers in a column in sequence in the order of date for each NAME
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

_ result _

enter image description here

9
Sarath Avanavu

あなたはのようなことをすることができます

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

分析関数 _ rank _ および/または DENSE_RANK を使用することもできますが、 _ rownum _ が最も簡単です。

7
Suman
select * from (
    select FName from MyTbl
)
where rownum <= 1;
6
a'r

つかいます:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

Oracle9i +を使用している場合は、ROW_NUMBER()のような分析関数を使用して を見ることができますが、ROWNUM と同じようには実行されません。

5
OMG Ponies

テーブルから最初の行を選択することとテーブルから1行を選択することは2つの異なるタスクであり、異なるクエリが必要です。その方法はたくさんあります。そのうちの4つは:

最初

select  max(Fname) from MyTbl;

第二

select  min(Fname) from MyTbl;

三番

select  Fname from MyTbl  where rownum = 1;

第4

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)
3
Vikas Hardia

私は同じ問題を抱えていた、そして私はこの解決策でこれを直すことができる:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

最初の値が一番上になるように、前に結果を注文することができます。

がんばろう

2
user2607028