【问题标题】:Oracle SQL Partition By to Select the Most Recent DateOracle SQL 分区依据以选择最近的日期
【发布时间】:2020-06-16 04:27:42
【问题描述】:

我正在使用下面的 SQL 从我的employee_life_events 表中选择堆栈顶部最近的生活事件。为了拉到堆栈的顶部(最近的),我需要将每个life_event_date 的最高le_seq_no 拉到ssn。因此,使用下面的 SQL,我按日期列出了每个成员 (ssn) 的堆栈生命事件记录的顶部。我现在需要提取最近的日期。现在我知道我可以尝试构建另一个子查询并使用一个 max 函数(不知道究竟如何才能得到这样的提示),但我也想知道是否有更有效的方法来通过分区执行此操作陈述。通过向partition by 部分添加一个字段或向order by 部分添加一个字段。

总而言之,我需要通过 SSN 从employee_life_events 表中拉出栈顶(最近的生活事件记录)。栈顶生命事件记录是最近的life_event_date 且具有最高le_seq_no(针对该特定日期)的记录(每个 SSN)。

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

【问题讨论】:

    标签: sql oracle window-functions


    【解决方案1】:

    栈顶生命事件记录是最近的 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2015-06-21
      • 2011-05-04
      • 2011-10-24
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多