【问题标题】:Comparing two tables that are the same and listing out the max date比较两个相同的表并列出最大日期
【发布时间】:2018-12-04 22:48:43
【问题描述】:

我想知道是否可以比较 same 表中具有相同 ID 的日期,但问题是有一个额外的列显示状态。例如,这是一个表 A:


我想看到的结果是这样的:

我知道我可以使用带有 ID 的 group by 和 max 聚合来查找最大日期;但是,我希望相关的状态(运行/停止)列存在。这对我有很大帮助。

【问题讨论】:

  • 澄清一下,您想为每个ID 获取一个MAX(Date)Status 的值对应于Date 的值。如果同一 IDDate 有多个条目,情况会怎样?

标签: sql oracle join compare


【解决方案1】:

在大多数数据库中,最快的方法(假设索引正确)是相关子查询:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.id = t.id);

即使不是最快的,这应该适用于任何数据库。

【讨论】:

    【解决方案2】:

    如果是 Oracle,您可以像这样使用KEEP 子句:

    SELECT t.id,
           MAX(t.status) KEEP (DENSE_RANK LAST ORDER BY t."DATE") AS corresponding_status,
           MAX(t."DATE") AS last_date
      FROM tab t
     GROUP BY t.id
     ORDER BY 1
    

    对于这个示例数据:

    +----+----------+------------+ |身份证 |状态 |日期 | +----+----------+------------+ | 1 |跑步 | 2018-02-03 | | 1 |停止 | 2018-04-04 | | 2 |跑步 | 2018-03-24 | | 2 |停止 | 2018-01-02 | | 3 |跑步 | 2018-06-12 | | 3 |停止 | 2018-06-12 | +----+----------+------------+

    这将返回这个结果:

    +----+----------+------------+ |身份证 |对应状态 | LAST_DATE | +----+----------+------------+ | 1 |停止 | 2018-04-04 | | 2 |跑步 | 2018-03-24 | | 3 |停止 | 2018-06-12 | +----+----------+------------+

    可以在SQL Fiddle 中看到。

    对于这种情况,当您在同一个 IDDATE 组合上有多个条目时,它会选择一个 STATUS 值 - 在这种情况下是最后一个(基于字母数字排序),就像我一样我在STATUS 上使用了MAXLAST ORDER BY t."DATE" 部分对应于我们如何在组中选择DATE 值,即选择组中的最后一个DATE

    更多详情请见this Oracle Docs entry

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多