我正在尝试对 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
:TABLE
只是SELECT * FROM
.UNION ALL
确保仅附加两个派生表,而不会尝试消除(不存在的)重复项,从而弄乱排序顺序。括号是必需的,因此
ORDER BY
仅适用于封闭SELECT
的行,而不适用于完整的行集。看:
合并多个 SELECT 语句
在 PostgreSQL 中的 UNION 之后是否保留了订单?
有关的:
组合 2 个 SELECT 查询并在 PostgreSQL 中打印结果
有没有更快的方法在 Postgres 中获得 UNION ALL 行为?
没有
UNION
结果相同。
结果
LEFT JOIN
是c.x
除了NULL
前 3 个选择的行。因此,第一ORDER BY
项c.x DESC NULLS LAST
仅对前 3 行进行排序,其余未排序。第二ORDER BY
项e.y DESC
根据需要对其余部分进行排序。关于
NULLS LAST
:db<>在这里摆弄
如果表不是非常小,你应该有一个索引
(x)
和另一个(y)
您可以尝试一个公用表表达式: