我想知道是否可以比较相同表中具有相同ID的日期,但是要注意的是,还有一个显示状态的列。例如,这是表A:
我想看到的结果是这样:
我知道我可以使用group by和ID的最大聚合来找到最大日期;但是,我想要关联的状态(运行/停止)列。这对我有很大帮助。
答案 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中可以看到。
在某些情况下,当您在同一个ID
和DATE
组合上有多个条目时,它将选择一个STATUS
值-在这种情况下,最后一个值(基于字母数字排序),就像我在MAX
上使用STATUS
一样。
LAST ORDER BY t."DATE"
部分对应于我们如何选择组中的DATE
值,即通过选择组中的最后一个DATE
。
有关更多详细信息,请参见this Oracle Docs entry。