Postgresql
如何以一種方式訂購一些行,而以另一種方式訂購其餘行?
我正在嘗試對 PostgreSQL 10.12 中的表中的行進行排序:
CREATE TABLE example ( id serial PRIMARY KEY, val text NOT NULL, x integer NOT NULL, y integer NOT NULL ); INSERT INTO example (val,x,y) VALUES ('First Value (This should be first order)',7,2) , ('Second Value (This should be second order)',6,3) , ('Third Value (This should be third order)',5,4) , ('Seventh Value (And This should be last order)',4,1) , ('Sixth Value (This should be sixth order)',3,5) , ('Fifth Value (This should be fifth order)',2,6) , ('Fourth Value (This should be fourth order)',1,7) ;
前三個結果行應按 排序
x desc
,其餘應按 排序y desc
。我嘗試了這個查詢,但它僅按以下順序排序
y
:SELECT * from (SELECT * from example order by x desc fetch first 3 rows only) foo UNION SELECT * from example order by y desc;
但它僅按
y
. 我需要在沒有UNION
.
這將返回前 3 行,
ORDER BY x DESC
並附加按以下順序排序的其餘行y DESC
:WITH cte AS (TABLE example ORDER BY x DESC LIMIT 3) TABLE cte UNION ALL ( -- parentheses required SELECT e.* FROM example e LEFT JOIN cte USING (id) WHERE cte.id IS NULL ORDER BY e.y DESC );
TABLE
只是SELECT * FROM
.
UNION ALL
確保僅附加兩個派生表,而不會嘗試消除(不存在的)重複項,從而弄亂排序順序。括號是必需的,因此
ORDER BY
僅適用於封閉SELECT
的行,而不適用於完整的行集。看:
有關的:
沒有
UNION
SELECT e.* FROM example e LEFT JOIN ( SELECT id, x FROM example ORDER BY x DESC LIMIT 3 ) c USING (id) ORDER BY c.x DESC NULLS LAST, e.y DESC;
結果相同。
結果
LEFT JOIN
是c.x
除了NULL
前 3 個選擇的行。因此,第一ORDER BY
項c.x DESC NULLS LAST
僅對前 3 行進行排序,其餘未排序。第二ORDER BY
項e.y DESC
根據需要對其餘部分進行排序。關於
NULLS LAST
:db<>在這裡擺弄
如果表不是非常小,你應該有一個索引
(x)
和另一個(y)