我在学习PostgreSQL方面还处于起步阶段(我现在正在学习postgresqltutorial SELECT教程(,并看到了DISTINCT ON。根据我的研究,这实际上是一个非常复杂的&强大的关键字,这有点超出了我现在的水平,但我想要一个基本的理解。
在psql中游刃有余,似乎是一种根据一列中的值筛选数据的方法,而不管其他列中的数据是否匹配。例如,如果你有一张人员和他们的成绩表,你可以进行过滤,这样每个年级只有一个人,而不需要他们有相同的名字,等等。
我走对了吗?
DISTINCT ON
是一个奇怪的野兽,如果没有例子,人们可能会很难理解。我的答案大量借鉴了本教程。
创建表格:
CREATE TABLE table1(
id serial,
fruit_1 TEXT,
fruit_2 TEXT
)
插入数据:
INSERT INTO table1 (fruit_1, fruit_2)
VALUES ('apple', 'apple'),
('apple', 'apple'),
('apple', NULL),
(NULL, 'apple'),
('apple', 'mango'),
('apple', 'blueberry'),
('mango', 'apple'),
('mango', 'blueberry'),
('mango', 'mango'),
('blueberry', 'apple'),
('blueberry', 'mango'),
('blueberry', 'blueberry')
SELECT * from table1
给出
id fruit_1 fruit_2
1 apple apple
2 apple apple
3 apple <NULL>
4 <NULL> apple
5 apple mango
6 apple blueberry
7 mango apple
8 mango blueberry
9 mango mango
10 blueberry apple
11 blueberry mango
12 blueberry blueberry
CCD_ 3仅保留所选列的第一行。但是,第一行是不可预测的,所以您需要使用ORDER BY
进行排序(并获得可预测的第一行(:
SELECT DISTINCT ON (fruit_1)
id, fruit_1, fruit_2
FROM
table1
ORDER BY fruit_1, fruit_2
id fruit_1 fruit_2
2 apple apple
10 blueberry apple
7 mango apple
4 <NULL> apple
您也可以在括号中使用列编号:
SELECT DISTINCT ON (2)
id, fruit_1, fruit_2
FROM
table1
ORDER BY fruit_1, fruit_2