如何从创建的列中选择最新记录
Posted
技术标签:
【中文标题】如何从创建的列中选择最新记录【英文标题】:how to select latest record from a created column 【发布时间】:2021-06-03 22:29:59 【问题描述】:我有一张表,其中有一堆经常更新的记录,我正在尝试编写代码以仅提取最新记录。在理想情况下,我会使用 updated_date 列来提取最新记录,但是,在许多情况下,updated-date 列是空白的,因此我必须使用以下代码创建一个新列:
CASE WHEN UPDATED_DATE IS NULL THEN CREATED_DATE ELSE UPDATED_DATE END latest_date
基本上,当 updated_date 为空白时,我创建了一个新列,使用 created_date,现在,我的数据如下所示:
updated_date | audit_id | created_date | latest_date |
---|---|---|---|
2021-04-02 | 006 | 2018-06-06 | 2021-04-02 |
NULL | 006 | 2018-06-06 | 2018-06-06 |
2020-03-01 | 006 | 2018-06-06 | 2020-03-01 |
NULL | 007 | 2018-07-07 | 2018-07-07 |
2020-04-01 | 007 | 2018-07-07 | 2020-04-01 |
2019-09-08 | 007 | 2018-07-07 | 2019-09-08 |
我想检索的只是最新信息:
updated_date | audit_id | created_date | latest_date |
---|---|---|---|
2021-04-02 | 006 | 2018-06-06 | 2021-04-02 |
2020-04-01 | 007 | 2018-07-07 | 2020-04-01 |
如果有人可以告诉我如何重试这些数据,那就太好了。
谢谢
【问题讨论】:
【参考方案1】:我假设您的意图是获取每个 audit_id
的最新行。如果是这样,你可以做类似的事情
select *
from (select t.*,
row_number() over (partition by audit_id
order by coalesce( updated_date, created_date ) desc ) rn
from your_table t)
where rn = 1;
如果您可以有两行具有相同的audit_id
和latest_date
,您可以使用rank
或dense_rank
函数而不是row_number
以不同方式处理关系,但我猜这不是您需要处理的问题并任意打破与row_number
的关系就足够了。
【讨论】:
非常感谢您的帮助!只是想知道你是否可以解释'coalesce'和'over partition by',我是oracle/sql的新手,所以不确定这些功能是什么。另外,我在网上搜索了“coalesce”,它说这个函数返回第一个非 NULL 值。我正在寻找的不是第一个非 NULL 值,而是最新的非 NULL 值。谢谢 @ops_mltsd -coalesce
返回传入参数的第一个非空值。它在逻辑上等同于您的 case
语句,只是更紧凑。 row_number
分析函数获取特定 audit_id
(分区依据)的所有行,按与 latest_date
等效的顺序排列,并分配行号。所以每个audit_id
将有一个rn
1、2、3 等,具体取决于表中的行数。然后外部子查询获取所有rn=1
行,这为您提供每个audit_id
的最新行。
感谢您解释得这么好,在我的数据中有些情况下所有 UPDATED_DATE 都是 NULL,在这种情况下,我必须采用最新的 CREATED_DATE。我猜这个 coalesce 和 rn=1 函数同时搜索 updated_date 和 created_date 并采用最新的非 NULL 日期?
@ops_mltsd - 对。这就是coalesce
的意义所在。您可以将coalesce
替换为您对latest_date
的case
语句。 coalesce
更紧凑。【参考方案2】:
您可以使用COALESCE
和FETCH FIRST n ROWS ONLY
(Oracle 12):
SELECT *
FROM table_name
ORDER BY COALESCE(UPDATED_DATE, CREATED_DATE) DESC
FETCH FIRST 2 ROWS ONLY;
【讨论】:
谢谢,FETCH FIRST 2 ROWS ONLY 和 row_number 有什么区别?以上是关于如何从创建的列中选择最新记录的主要内容,如果未能解决你的问题,请参考以下文章