Postgresql

如何以一種方式訂購一些行,而以另一種方式訂購其餘行?

  • July 24, 2020

我正在嘗試對 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.

這是一個 SqlFiddle。

這將返回前 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 JOINc.x除了NULL前 3 個選擇的行。因此,第一ORDER BYc.x DESC NULLS LAST僅對前 3 行進行排序,其餘未排序。第二ORDER BYe.y DESC根據需要對其餘部分進行排序。

關於NULLS LAST

db<>在這裡擺弄

如果表不是非常小,你應該有一個索引(x)和另一個(y)

引用自:https://dba.stackexchange.com/questions/271537