Odpowiedzi:
Jeśli chcesz tylko pierwszy wybrany wiersz, możesz:
select fname from MyTbl where rownum = 1
Możesz także użyć funkcji analitycznych, aby zamówić i wziąć górę x:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
jednego można to zmienić naWHERE ROWNUM <= X
Dzięki Oracle 12c (czerwiec 2013 r.) Możesz używać jej w następujący sposób.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
najwyraźniej nie jest to konieczne, możesz użyć, FETCH NEXT 1 ROWS ONLY
a nawet FETCH FIRST ROW ONLY
, kolejność według jest ważna lub będzie równoważna z samym użyciem WHERE rownum = 1
. Próbowałem nawet w instrukcji OUTER APPLY i działało to jak funkcja TOP Ms-SQL.
TIES
. Odnosi się to do przypadków, w których występują powiązania dla wersji 12c +
i12c -
Możesz użyć ROW_NUMBER()
z ORDER BY
klauzulą w zapytaniu podrzędnym i użyć tej kolumny zamiast TOP N
. Można to wyjaśnić krok po kroku.
Zobacz poniższą tabelę, która ma dwie kolumny NAME
i DT_CREATED
.
Jeśli potrzebujesz wziąć tylko dwie pierwsze daty, niezależnie od tego NAME
, możesz użyć poniższego zapytania. Logika została zapisana 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
W niektórych sytuacjach musimy wybrać TOP N
wyniki dla każdego z nich NAME
. W takim przypadku możemy użyć PARTITION BY
z ORDER BY
klauzulą w zapytaniu podrzędnym. Zobacz poniższe zapytanie.
-- 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
with (select ... ) as
klauzula) nic nie zmienia w tym problemie, CTE po prostu ma na celu czytanie i wspieranie zapytań. Dobrze? @Sarath Avanavu
Możesz zrobić coś takiego
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Można również skorzystać z funkcji analitycznych RANK i / lub DENSE_RANK , ale ROWNUM jest chyba najprostszy.
Posługiwać się:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Jeśli używasz Oracle9i +, możesz spojrzeć na użycie funkcji analitycznych takich jak ROW_NUMBER (), ale nie będą one działały tak dobrze, jak ROWNUM .
Aby wybrać pierwszy wiersz z tabeli i wybrać jeden wiersz z tabeli, są dwa różne zadania i wymagają innego zapytania. Można to zrobić na wiele sposobów. Cztery z nich to:
Pierwszy
select max(Fname) from MyTbl;
druga
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)
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