Відповіді:
Якщо ви хочете лише перший вибраний рядок, ви можете:
select fname from MyTbl where rownum = 1
Ви також можете використовувати аналітичні функції, щоб замовити та взяти верхній х:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
одного можна змінити його наWHERE ROWNUM <= X
Завдяки Oracle 12c (червень 2013 року) ви можете користуватися ним, як описано нижче.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
мабуть, не потрібно, ви можете використовувати FETCH NEXT 1 ROWS ONLY
або навіть FETCH FIRST ROW ONLY
, порядок є важливим, або він буде еквівалентний просто використанню WHERE rownum = 1
. Я навіть спробував це в інструкції OUTER APPLY, і він працював як TOP-функція Ms-SQL там.
TIES
. Зверніться в цьому , за винятком випадків , коли виникають зв'язку для версії 12c +
і12c -
Ви можете використовувати ROW_NUMBER()
з ORDER BY
пунктом в підзапит і використовувати цю колонку в заміні TOP N
. Це можна пояснити поетапно.
Дивіться таблицю нижче, яка містить два стовпці NAME
та DT_CREATED
.
Якщо вам потрібно взяти лише перші дві дати незалежно від NAME
, ви можете скористатись поданим нижче запитом. Логіка була записана всередині запиту
-- 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;
РЕЗУЛЬТАТ
У деяких ситуаціях нам потрібно підбирати TOP N
результати, відповідні кожному NAME
. У такому випадку ми можемо використовувати 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;
РЕЗУЛЬТАТ
with (select ... ) as
пункт) нічого не змінює до цієї проблеми, CTE просто спрямований на читання та підтримку запитів. Правильно? @Sarath Avanavu
Можна зробити щось на кшталт
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Ви також можете використовувати аналітичні функції RANK та / або DENSE_RANK , але ROWNUM , мабуть, найпростіший.
Використання:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Якщо ви використовуєте Oracle9i +, ви можете подивитися на такі аналітичні функції, як ROW_NUMBER (), але вони не працюватимуть так само добре, як ROWNUM .
Щоб вибрати перший рядок із таблиці та вибрати один рядок із таблиці, це дві різні задачі та потребує різного запиту. Існує багато можливих способів зробити це. Чотири з них:
Перший
select max(Fname) from MyTbl;
Друге
select min(Fname) from MyTbl;
Третя
select Fname from MyTbl where rownum = 1;
Четверте
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
У мене була така ж проблема, і я можу виправити це за допомогою цього рішення:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Ви можете замовити результат раніше, щоб мати перше значення зверху.
Удачі