#oracle
#Oracle
Вопрос:
Таблица A
ID EmpNo Grade
--------------------
1 100 HIGH
2 105 LOW
3 100 MEDIUM
4 100 LOW
5 105 LOW
Запрос:
select *
from A
where EMPNO = 100
and rownum <= 2
order by ID desc
Я попробовал этот запрос, чтобы получить значение max и max-1; Мне нужно сравнить оценку с max и max-1, если равно, мне нужно установить флаг как ‘Y’ или ‘N’ без использования курсора. Также я не хочу сканировать всю запись дважды.
Пожалуйста, помогите мне.
Ответ №1:
ROWNUM применяется перед ORDER BY, поэтому вам нужно вложить запрос следующим образом:
select * from
(select * from A where EMPNO =100 order by ID desc)
where rownum<=2
Это выполняет только одно сканирование таблицы (или может использовать индекс в EMPNO).
Комментарии:
1. как здесь расшифровать? мне нужно проверить оценку из rownum = 1 и rownum = 2, если равно, мне нужно ‘Y’ как o / p или ‘N’
Ответ №2:
select *
from (
select id, emp_no, grade
, case
when lag(grade) over (order by emp_no desc) = grade
then 'Y'
else 'N'
end
as flag
, dense_rank() over( order by emp_no desc) as rank
from t
)
where rank <=2
;