Хорошо ли использовать rownum с заранее установленным результатом, или следует использовать ранг? - PullRequest
2 голосов
/ 26 января 2012

Я пишу запрос Oracle, который должен получить самое последнее событие на основе даты, когда оно произошло.

У меня есть два запроса, которые, кажется, работают правильно в моих тестовых примерах.

Первый использует подзапрос для получения событий в порядке дат, а затем я просто извлекаю первую запись через rownum:

    SELECT description FROM
    (
     SELECT description FROM tablename
     WHERE ((event_type IN ('A','I','Y')) AND (meeting_date IS NOT NULL) 
     AND id='whatever') 
     ORDER BY meeting_date DESC
    )
    WHERE rownum = 1

Второй использует ранг для достижения того же результата:

SELECT description FROM
(
SELECT description, RANK() OVER( ORDER BY meeting_date DESC) mtg_rank 
 FROM tablename 
 WHERE ((event_type IN ('A','I','Y'))  AND (meeting_date IS NOT NULL) 
 AND id= 'whatever') 
)
WHERE mtg_rank = 1

Для меня предварительно отсортированный rownum достаточно прост, и я бы пошел с ним. Я понимаю, что rownum работает раньше, поэтому я сначала выполнил упорядочивание в подвыборке.

Однако я не уверен, что мне что-то не хватает с этой мыслью?

Мне также интересно, является ли ранжирование в этом случае предпочтительной / наилучшей практикой или, возможно, лучше передать смысл запроса?

1 Ответ

4 голосов
/ 26 января 2012

За исключением случаев связей (о которых хорошо говорит комментарий Брайана), оба запроса будут работать и возвращать одинаковые результаты.

Лично я бы предпочел подход с аналитической функцией, потому что он гораздо более адаптируем. Вы можете настроить обработку связей, переключаясь между аналитическими функциями RANK, DENSE_RANK и ROW_NUMBER. Вы также можете сделать такие вещи, как добавить предложение PARTITION BY, чтобы возвращать самое последнее собрание для каждого ID, если вы хотите выполнить запрос для нескольких значений ID вместо одного.

...