对不起有点模糊的标题。不知道如何更好地描述它。
我有这样的表
CREATE TABLE foo (
id INT NOT NULL,
version INT NOT NULL,
data VARCHAR(200) NULL,
PRIMARY KEY (id, version)
);
使用这样的数据:
INSERT INTO foo
VALUES
(1, 1, '1.1'),
(2, 1, '2.1'),
(3, 1, '3.1'),
(1, 2, '1.2'),
(2, 2, '2.2'),
(4, 1, '4.1'),
(1, 3, '1.3'),
(4, 2, '4.2');
我需要获取所有行(或具有最高id
值的 N 行。这实际上会更频繁地使用最新可用version
和唯一{{1} }。我现在有两个问题似乎正在起作用。但是,如果有更好的方法,我在SQL中没有足够的信心来决定哪个更好。此外,我不认为我需要任何额外的索引,但同样,欢迎提出建议。 DB是PostgreSQL(9.5),我期望千分之一行(但在不久的将来它可能不会是10000)。
查询1:
id
查询2:
test_db=# SELECT DISTINCT ON (id) id, version, data FROM foo ORDER BY id DESC, version DESC;
id | version | data
----+---------+------
4 | 2 | 4.2
3 | 1 | 3.1
2 | 2 | 2.2
1 | 3 | 1.3
(4 rows)
test_db=# SELECT DISTINCT ON (id) id, version, data FROM foo ORDER BY id DESC, version DESC limit 2;
id | version | data
----+---------+------
4 | 2 | 4.2
3 | 1 | 3.1
(2 rows)