假设我有下一个数据
id date another_info
1 2014-02-01 kjkj
1 2014-03-11 ajskj
1 2014-05-13 kgfd
2 2014-02-01 SADA
3 2014-02-01 sfdg
3 2014-06-12 fdsA
我想为每个ID提取最后的信息:
id date another_info
1 2014-05-13 kgfd
2 2014-02-01 SADA
3 2014-06-12 fdsA
我怎么能做到呢?
5条答案
按热度按时间rkkpypqq1#
最有效的方法是使用Postgres的
distinct on
运算符如果您想要一个跨数据库工作的解决方案(但效率较低),可以使用窗口函数:
在大多数情况下,使用窗口函数的解决方案比使用子查询要快。
sr4lhrrt2#
y4ekin9u3#
我发现这是最快的解决方案:
5kgi1eie4#
对于大多数情况,最有效的方法是使用
GROUP BY
我看到了公认的答案,它确定使用
distinct on (id) id
是解决问题中描述的问题的最有效的方法,但我相信它是非常不准确的。遗憾的是,我无法从POSTGRES文档中找到任何有用的见解,但我确实找到了this article,它引用了一些其他的,并提供了示例,而GROUPBY方法肯定会带来更好的性能
我们曾在工作中讨论过这个问题,并在一个表上做了一些实验,该表保存了一些关于标签 Flink 的数据,有4,114,692行,并具有基于tag_id和timestamp的索引(独立索引)
以下是查询:
1.使用字典:
2.使用CTE + group by + join:
结果是明确的,并且支持此场景的第二种解决方案(在我看来,这是非常通用的),
显示其1655.991毫秒(00:01.656)比16723.346毫秒(00:16.723)快了10倍(!),当然也提供了相同的数据。
q43xntqr5#
按id分组并使用任何聚合函数来满足最后一条记录的条件。