2000-01-06 07:40:54 +01:00
|
|
|
--
|
|
|
|
-- SELECT_DISTINCT_ON
|
|
|
|
--
|
2000-01-27 19:11:50 +01:00
|
|
|
SELECT DISTINCT ON (string4) string4, two, ten
|
2022-02-08 21:30:38 +01:00
|
|
|
FROM onek
|
2000-01-27 19:11:50 +01:00
|
|
|
ORDER BY string4 using <, two using >, ten using <;
|
|
|
|
string4 | two | ten
|
|
|
|
---------+-----+-----
|
|
|
|
AAAAxx | 1 | 1
|
|
|
|
HHHHxx | 1 | 1
|
|
|
|
OOOOxx | 1 | 1
|
|
|
|
VVVVxx | 1 | 1
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
-- this will fail due to conflict of ordering requirements
|
|
|
|
SELECT DISTINCT ON (string4, ten) string4, two, ten
|
2022-02-08 21:30:38 +01:00
|
|
|
FROM onek
|
2000-01-27 19:11:50 +01:00
|
|
|
ORDER BY string4 using <, two using <, ten using <;
|
|
|
|
ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
|
2008-09-01 22:42:46 +02:00
|
|
|
LINE 1: SELECT DISTINCT ON (string4, ten) string4, two, ten
|
|
|
|
^
|
2000-01-27 19:11:50 +01:00
|
|
|
SELECT DISTINCT ON (string4, ten) string4, ten, two
|
2022-02-08 21:30:38 +01:00
|
|
|
FROM onek
|
2000-01-27 19:11:50 +01:00
|
|
|
ORDER BY string4 using <, ten using >, two using <;
|
|
|
|
string4 | ten | two
|
|
|
|
---------+-----+-----
|
|
|
|
AAAAxx | 9 | 1
|
|
|
|
AAAAxx | 8 | 0
|
|
|
|
AAAAxx | 7 | 1
|
|
|
|
AAAAxx | 6 | 0
|
|
|
|
AAAAxx | 5 | 1
|
|
|
|
AAAAxx | 4 | 0
|
|
|
|
AAAAxx | 3 | 1
|
|
|
|
AAAAxx | 2 | 0
|
|
|
|
AAAAxx | 1 | 1
|
|
|
|
AAAAxx | 0 | 0
|
|
|
|
HHHHxx | 9 | 1
|
|
|
|
HHHHxx | 8 | 0
|
|
|
|
HHHHxx | 7 | 1
|
|
|
|
HHHHxx | 6 | 0
|
|
|
|
HHHHxx | 5 | 1
|
|
|
|
HHHHxx | 4 | 0
|
|
|
|
HHHHxx | 3 | 1
|
|
|
|
HHHHxx | 2 | 0
|
|
|
|
HHHHxx | 1 | 1
|
|
|
|
HHHHxx | 0 | 0
|
|
|
|
OOOOxx | 9 | 1
|
|
|
|
OOOOxx | 8 | 0
|
|
|
|
OOOOxx | 7 | 1
|
|
|
|
OOOOxx | 6 | 0
|
|
|
|
OOOOxx | 5 | 1
|
|
|
|
OOOOxx | 4 | 0
|
|
|
|
OOOOxx | 3 | 1
|
|
|
|
OOOOxx | 2 | 0
|
|
|
|
OOOOxx | 1 | 1
|
|
|
|
OOOOxx | 0 | 0
|
|
|
|
VVVVxx | 9 | 1
|
|
|
|
VVVVxx | 8 | 0
|
|
|
|
VVVVxx | 7 | 1
|
|
|
|
VVVVxx | 6 | 0
|
|
|
|
VVVVxx | 5 | 1
|
|
|
|
VVVVxx | 4 | 0
|
|
|
|
VVVVxx | 3 | 1
|
|
|
|
VVVVxx | 2 | 0
|
|
|
|
VVVVxx | 1 | 1
|
|
|
|
VVVVxx | 0 | 0
|
|
|
|
(40 rows)
|
1997-04-06 10:29:57 +02:00
|
|
|
|
2009-09-12 02:04:59 +02:00
|
|
|
-- bug #5049: early 8.4.x chokes on volatile DISTINCT ON clauses
|
|
|
|
select distinct on (1) floor(random()) as r, f1 from int4_tbl order by 1,2;
|
|
|
|
r | f1
|
|
|
|
---+-------------
|
|
|
|
0 | -2147483647
|
|
|
|
(1 row)
|
|
|
|
|
2022-10-28 12:04:38 +02:00
|
|
|
--
|
|
|
|
-- Test the planner's ability to use a LIMIT 1 instead of a Unique node when
|
|
|
|
-- all of the distinct_pathkeys have been marked as redundant
|
|
|
|
--
|
|
|
|
-- Ensure we also get a LIMIT plan with DISTINCT ON
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
SELECT DISTINCT ON (four) four,two
|
|
|
|
FROM tenk1 WHERE four = 0 ORDER BY 1;
|
|
|
|
QUERY PLAN
|
|
|
|
----------------------------------
|
|
|
|
Result
|
|
|
|
-> Limit
|
|
|
|
-> Seq Scan on tenk1
|
|
|
|
Filter: (four = 0)
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
-- and check the result of the above query is correct
|
|
|
|
SELECT DISTINCT ON (four) four,two
|
|
|
|
FROM tenk1 WHERE four = 0 ORDER BY 1;
|
|
|
|
four | two
|
|
|
|
------+-----
|
|
|
|
0 | 0
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- Ensure a Sort -> Limit is used when the ORDER BY contains additional cols
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
SELECT DISTINCT ON (four) four,two
|
|
|
|
FROM tenk1 WHERE four = 0 ORDER BY 1,2;
|
|
|
|
QUERY PLAN
|
|
|
|
----------------------------------
|
|
|
|
Limit
|
|
|
|
-> Sort
|
|
|
|
Sort Key: two
|
|
|
|
-> Seq Scan on tenk1
|
|
|
|
Filter: (four = 0)
|
|
|
|
(5 rows)
|
|
|
|
|
|
|
|
-- Same again but use a column that is indexed so that we get an index scan
|
|
|
|
-- then a limit
|
|
|
|
EXPLAIN (COSTS OFF)
|
|
|
|
SELECT DISTINCT ON (four) four,hundred
|
|
|
|
FROM tenk1 WHERE four = 0 ORDER BY 1,2;
|
|
|
|
QUERY PLAN
|
|
|
|
-----------------------------------------------------
|
|
|
|
Result
|
|
|
|
-> Limit
|
|
|
|
-> Index Scan using tenk1_hundred on tenk1
|
|
|
|
Filter: (four = 0)
|
|
|
|
(4 rows)
|
|
|
|
|