刚开始对StackOverflow社区表达了太多的喜爱:)
所以我有一个Postgres数据库表,但让我们减少到重要的列:
id (string/int), when (timestamp/time/date), canonical (boolean)
Canonical 在这种情况下意味着“接受版本历史记录的一部分”。
假设我们的表格如下:
2, 2003-01-08, true
2, 2002-01-08, false
1, 2001-01-08, false
3, 2000-01-08, false
2, 2000-01-08, true
1, 2000-01-08, true
1, 1999-01-08, true
我想要一个查询,找到每个ID的最新规范版本。结果应如下所示:
2, 2003-01-08, true
1, 2000-01-08, true
我猜两个问题:
更大,更多的元问题是,是否有更好的方法来处理存储此类信息。
答案 0 :(得分:4)
select distinct on (id) *
from t
where canonical
order by id, "when" desc
此查询的最佳索引是部分索引
create index index_name on t (id, "when" desc) where canonical;
http://www.postgresql.org/docs/current/static/sql-createindex.html
答案 1 :(得分:1)
select id, max("when")
from t
where canonical
group by id;
在某些情况下 可能 faster而不是distinct on
变体,您无需按id
对结果进行排序。