sql - 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
解决方案
栈顶生命事件记录是最近的 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
这使用与原始查询不同的分区和排序。我还消除了不必要的嵌套级别。
推荐阅读
- flutter - Flutter:普通值的缓存管理器?
- python-3.x - Python 请求返回状态 200,但未执行预期操作
- c# - 请求来自 Postman,但不是来自 C# 代码
- laravel - Laravel - 使用 with 方法对多个急切加载的关系进行多个查询功能
- javascript - JSDoc 定义 @type 无需初始化新变量
- python - VSCode 中的 Python:切换到正确环境的最简单方法是什么?
- datatable - Vuetify 2.2.20 数据表行每页位置错误
- sql - 从table1插入一个table2获取id然后插入table3 SQL server
- ansible - 如何修复 drupalvm 错误:来宾上不存在剧本?
- gradle - 仅使用我们自己的自定义 Kotlin 类分发和运行 jar 文件