Oracle SQL Разделить по, чтобы выбрать самую последнюю дату - PullRequest
0 голосов
/ 03 марта 2020

Я использую приведенное ниже SQL, чтобы выбрать из моей таблицы employee_life_events последнее событие жизни на вершине стека. Чтобы вытащить вершину стека (самое последнее), мне нужно было вытащить наибольшее значение le_seq_no для каждого life_event_date на ssn. Таким образом, с SQL ниже у меня есть запись о жизни в верху стека для каждого члена (ssn) по дате Теперь мне нужно вытащить самую последнюю дату. Теперь я знаю, что мог бы попытаться создать еще один подзапрос и использовать функцию max (точно не знаю, как это будет цениться), но мне также интересно, есть ли более эффективный способ сделать это с помощью раздела заявление. Добавляя поле в часть partition by или добавляя поле в часть order by.

Итак, чтобы подвести итог, мне нужно вытащить вершину стека (самая последняя запись события жизни) из таблицы employee_life_events по SSN. Самая верхняя запись события жизни стека - это запись (по SSN), которая является самой последней life_event_date и имеет самую высокую le_seq_no (для этой конкретной даты).

SELECT *
FROM

(SELECT *
FROM
    (SELECT ele1.*,
        ROW_NUMBER() OVER (PARTITION BY ele1.SSN, LIFE_EVENT_DATE ORDER BY LIFE_EVENT_DATE DESC, LE_SEQ_NO DESC) as seqnum
    FROM EMPLOYEE_LIFE_EVENTS ele1) ele1
WHERE seqnum = 1) ele

1 Ответ

2 голосов
/ 03 марта 2020

Самая верхняя запись события жизненного цикла стека - это запись (для каждого SSN), которая является самой последней датой life_event_date и имеет самое высокое значение le_seq_no (для этой конкретной даты).

I думаю, что вы хотите:

select t.*
from (
    select 
        e.*,
        row_number() over(
            partition by ssn
            order by life_event_date desc, le_seq_no desc
        ) rn
    from employee_life_events e
) t
where rn = 1

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

...