比较两个相同的表并列出最大日期

时间:2018-12-04 22:48:43

标签: sql oracle join compare

我想知道是否可以比较相同表中具有相同ID的日期,但是要注意的是,还有一个显示状态的列。例如,这是表A:

Original Table


我想看到的结果是这样:

Results

我知道我可以使用group by和ID的最大聚合来找到最大日期;但是,我想要关联的状态(运行/停止)列。这对我有很大帮助。

2 个答案:

答案 0 :(得分:2)

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

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

即使不是最快的方法,也可以在任何数据库中使用。

答案 1 :(得分:0)

对于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

对于此示例数据:

+----+---------+------------+
| ID | STATUS  | DATE       |
+----+---------+------------+
|  1 | Running | 2018-02-03 |
|  1 | Stopped | 2018-04-04 |
|  2 | Running | 2018-03-24 |
|  2 | Stopped | 2018-01-02 |
|  3 | Running | 2018-06-12 |
|  3 | Stopped | 2018-06-12 |
+----+---------+------------+

这将返回以下结果:

+----+----------------------+------------+
| ID | CORRESPONDING_STATUS | LAST_DATE  |
+----+----------------------+------------+
|  1 | Stopped              | 2018-04-04 |
|  2 | Running              | 2018-03-24 |
|  3 | Stopped              | 2018-06-12 |
+----+----------------------+------------+

在此SQL Fiddle中可以看到。

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

有关更多详细信息,请参见this Oracle Docs entry