假设我有以下 PostgreSQL 表,名为products
:
CREATE TABLE IF NOT EXISTS mytable (
id serial NOT NULL PRIMARY KEY,
label VARCHAR(50) NOT NULL,
info jsonb NOT NULL,
created_at timestamp NOT NULL DEFAULT now()
);
这是一些测试数据。请注意,我的实际表有数百万条记录。
INSERT INTO products (label, info) VALUES ('a', '[1, 2, 3]');
INSERT INTO products (label, info) VALUES ('a', '[1, 2, 3]');
INSERT INTO products (label, info) VALUES ('c', '[1, 2, 3]');
INSERT INTO products (label, info) VALUES ('c', '[1, 2, 3]');
INSERT INTO products (label, info) VALUES ('b', '[1, 2, 3]');
我想编写一个查询来获取不同的标签并按以下顺序对记录进行排序created_at
场地。我的第一反应是编写以下查询:
SELECT DISTINCT ON (label) * FROM products ORDER BY created_at DESC;
但是,此操作失败并出现以下错误:
错误:SELECT DISTINCT ON 表达式必须与初始 ORDER BY 表达式匹配
看起来我可以使用 SQL 子查询来解决这个问题:
SELECT * FROM (
SELECT DISTINCT ON (label) * FROM products
) AS subquery ORDER BY created_at DESC;
生成以下预期结果:
id | label | info | created_at
----+-------+-----------+----------------------------
5 | b | [1, 2, 3] | 2022-11-14 03:32:23.245669
3 | c | [1, 2, 3] | 2022-11-14 03:32:23.242813
1 | a | [1, 2, 3] | 2022-11-14 03:32:23.239791
这是解决此问题的最佳方法吗?或者有没有更快的方法来查询这些数据?请注意,我在上面提到了我的实际表如何拥有数百万条记录,因此我想提出尽可能最佳的查询。