我的桌子看起来像这样:
ID FROM WHEN
1 mario 24.10.19
1 robin 23.10.19
2 mario 24.10.19
3 robin 23.10.19
3 mario 22.10.19
我只想要ID中的最新记录。因此结果应如下所示:
ID FROM WHEN
1 mario 24.10.19
2 mario 24.10.19
3 robin 23.10.19
我不知道如何得到这个结果
group by
祝我好运:select id,
max("from") keep (dense_rank first order by "when" desc) as "from",
max("when") as when
from t
group by id;
在这种情况下,关联的子查询通常在(id, when)
上具有索引时表现良好。
select t.* from t where t."when" = (select max(t2."when") from t t2 where t2.id = t.id);
并且规范的解决方案是使用窗口函数:
select t.* from (select t.*, row_number() over (partition by id order by "when" desc) as seqnum from t ) t where seqnum = 1;
Oracle有一个智能的优化器,但这需要做更多的工作,因为在过滤之前,行号已分配给all行。这可能会使它(在某些数据库中)比其他方法慢一点,但是它仍然是一个非常可行的解决方案。