首页 > 解决方案 > Oracle SQL 分区依据以选择最近的日期

问题描述

employee_life_events我正在使用下面的 SQL 从我的表中选择堆栈顶部最近的生活事件。为了拉到堆栈的顶部(最近的),我需要将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

标签: sqloraclewindow-functions

解决方案


栈顶生命事件记录是最近的 life_event_date 且具有最高 le_seq_no (针对该特定日期)的记录(每个 SSN)。

我认为你想要:

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

这使用与原始查询不同的分区和排序。我还消除了不必要的嵌套级别。


推荐阅读