【发布时间】:2019-08-31 02:04:37
【问题描述】:
我有这样的输入日期:
id_number category type date
123 horse big 1/1/2019
123 horse big 1/15/2019
234 pig small 1/20/2019
123 horse big 2/1/2019
234 pig medium 2/1/2019
345 dog tiny 2/1/2019
对于最近日期(2/1/2019)的记录,我想检索哪些记录(由id_number 标识)是全新的,哪些已经更新。
想要的结果:
id_number category type date new_or_updated
234 pig medium 2/1/2019 updated
345 dog tiny 2/1/2019 new
记录 234 已更新,因为 type 已从先前的记录更改。记录 345 是全新的,因为之前没有记录是 id_number 345。 2019 年 2 月 1 日的记录 123 被排除在外,因为它不是新的,也不是从 2019 年 1 月 15 日发生的之前的 123 记录更新的。
我如何识别新的和更新的记录?
我尝试使用row_number() 来划分除date 之外的所有字段,但我不确定从那里去哪里,row_number() 没有按预期工作,因为它分配了不同的数字到date之外没有差异的记录。
select row_number() over (partition by id_number, category, type order by id_number),
id_number,
category,
type,
date
from schema.table
【问题讨论】:
-
PL/SQL 是一种命令式编程语言,由 Oracle 创建,用于与其 SQL 版本协同工作。您的问题与 PL/SQL 完全无关 - 它与 Oracle SQL 有关。我更改了您的标题和标签以反映这一点。不要感觉太糟糕 - 很多人(错误地)认为 PL/SQL 只是意味着“Oracle SQL”。
-
如果 123 的第一行的类型是小而不是大,您希望输出什么?
-
你如何定义“最近的日期”?您是说每个 id_number 的“最近日期”吗?而且,为什么
id = 123不包含在您的输出中?是不是因为自上一行以来没有任何变化(意思是:category和type和以前一样)? -
感谢@mathguy!我会将最近的日期定义为 2/1/2019 - 这将是报告日期。任何日期都可以是报告日期,因此如果我想查看截至 2019 年 1 月 20 日哪些记录是新的或更新的,我想查看该记录及其之前的两条记录。正确 - 自给定
id_number的上一行以来,123 没有更改 -
@Boneist 输出将保持不变,因为 123 与当前报告日期(2019 年 2 月 1 日)相比没有变化,并且上次 123 出现在表格中。