sql - strip 化 PostgreSQL 结果集的顺序

标签 sql postgresql sorting sql-order-by

假设我有下表:

create temp table test (id serial, number integer);
insert into test (number) 
values (5), (4), (3), (2), (1), (0);

如果我按数字降序排序,我会得到:

select * from test order by number desc;
id | number
---+--------
 1 | 5
 2 | 4
 3 | 3
 4 | 2
 5 | 1
 6 | 0

如果我按数字升序排序,我会得到:

select * from test order by number asc;

6 | 0
5 | 1
4 | 2
3 | 3
2 | 4
1 | 5

如何对顺序进行 strip 化,使其每行在升序和降序之间交替? 例如:

6 | 0   or   1 | 5
1 | 5        6 | 0
5 | 1        2 | 4
2 | 4        5 | 1
4 | 2        3 | 3
3 | 3        4 | 2

最佳答案

更新

WITH x AS (
    SELECT *
         , row_number() OVER (ORDER BY number) rn_up
         , row_number() OVER (ORDER BY number DESC) rn_down
    FROM   test
    )
SELECT id, number
FROM   x
ORDER  BY LEAST(rn_up, rn_down), number;

或者:

...
ORDER  BY LEAST(rn_up, rn_down), number  DESC;

从较大的数字开始。

一开始我有两个 CTE,但一个就足够了 - 更简单、更快。

关于sql - strip 化 PostgreSQL 结果集的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419152/

相关文章:

c# - 对名称值集合进行排序

sql - 使用 SQL Server 创建一对多关系

SQL 返回一个不同的列和不同列的第一个日期

sql - 解析 SQL 表中以破折号分隔的值并进行查找

java - 如何将 String[] 参数设置为 native 查询?

php - PostgreSQL LISTEN/NOTIFY 不工作

java - 按特定值对对象列表进行排序

algorithm - shell排序的理解

sql - 如何为下表编写 SQL 查询?

sql - Redshift 光谱 : how to import only certain files