如何从创建的列中选择最新记录

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_idlatest_date,您可以使用rankdense_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_datecase 语句。 coalesce 更紧凑。【参考方案2】:

您可以使用COALESCEFETCH 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 有什么区别?

以上是关于如何从创建的列中选择最新记录的主要内容,如果未能解决你的问题,请参考以下文章

如何创建临时表或仅从循环中的列中选择不同的值

如何在postgresql的列中针对单个记录选择多个值[重复]

SQL Server:从最大日期/最新日期的记录中获取数据

如何从一个表中过滤出其 id 出现在另一个表的列中的记录

如何从表中选择哪个名称存储在另一个表中带有“0”前缀的列中

如何在带有子查询的列中“更新选择”某些值?