带有行版本控制的PostgreSQL数据库

时间:2014-05-27 15:59:24

标签: sql postgresql

刚开始对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

我猜两个问题:

  1. 你会如何为此写一个查询?
  2. 可以编入索引吗?
  3. 更大,更多的元问题是,是否有更好的方法来处理存储此类信息。

2 个答案:

答案 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对结果进行排序。