Jak zrobić top 1 w Oracle?

Jak wykonać następujące czynności?

select top 1 Fname from MyTbl

W Oracle 11g ?

Author: a_horse_with_no_name, 2010-08-10

9 answers

Jeśli chcesz tylko pierwszy wybrany wiersz, możesz:

select fname from MyTbl where rownum = 1

Możesz również użyć funkcji analitycznych, aby zamówić i wziąć górę x:

select max(fname) over (rank() order by some_factor) from MyTbl
 209
Author: mcpeterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-12 14:36:12
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
 133
Author: Damian Leszczyński - Vash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 17:13:26

Z Oracle 12c (czerwiec 2013) możesz go używać w następujący sposób.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
 22
Author: MSK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-12 14:38:15

Możesz użyć ROW_NUMBER() z klauzulą ORDER BY w sub-query i użyć tej kolumny w zastępstwie TOP N. Można to wyjaśnić krok po kroku.

Patrz poniższa tabela zawierająca dwie kolumny NAME i DT_CREATED.

Tutaj wpisz opis obrazka

Jeśli musisz wziąć tylko dwie pierwsze daty niezależnie od NAME, możesz skorzystać z poniższego zapytania. Logika została napisana w zapytaniu

-- 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;

Wynik

Tutaj wpisz opis obrazka

W niektórych sytuacje, musimy wybrać TOP N Wyniki odpowiadające każdemu NAME. W takim przypadku możemy użyć PARTITION BY z klauzulą ORDER BY w sub-zapytaniu. Zapoznaj się z poniższym zapytaniem.

-- 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;

Wynik

Tutaj wpisz opis obrazka

 9
Author: Sarath Avanavu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 04:59:01

Możesz zrobić coś takiego

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

Możesz również użyć funkcji analitycznych RANK i / lub DENSE_RANK, ale ROWNUM jest prawdopodobnie najłatwiejsze.

 7
Author: Suman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-10 05:20:39

Użycie:

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

Jeśli używasz Oracle9i+, możesz spojrzeć na używając funkcji analitycznych, takich jak ROW_NUMBER (), ale nie będą one działać tak dobrze, jak ROWNUM.

 5
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 17:31:21
select * from (
    select FName from MyTbl
)
where rownum <= 1;
 5
Author: a'r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 10:07:00

Aby wybrać pierwszy wiersz z tabeli i wybrać jeden wiersz z tabeli, są dwa różne zadania i wymagają innego zapytania. Istnieje wiele możliwych sposobów, aby to zrobić. Cztery z nich to:

Pierwszy

select  max(Fname) from MyTbl;

Drugi

select  min(Fname) from MyTbl;

Trzeci

select  Fname from MyTbl  where rownum = 1;

Czwarty

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)
 3
Author: Vikas Hardia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-12 14:37:37

Miałem ten sam problem i mogę to naprawić za pomocą tego rozwiązania:

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

Możesz zamówić swój wynik wcześniej, aby mieć pierwszą wartość na górze.

Powodzenia

 2
Author: user2607028,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 17:17:54