use*_*681 8 sql sorting postgresql sql-order-by
假设我有下表:
create temp table test (id serial, number integer);
insert into test (number)
values (5), (4), (3), (2), (1), (0);
Run Code Online (Sandbox Code Playgroud)
如果按数字降序排序,我得到:
select * from test order by number desc;
id | number
---+--------
1 | 5
2 | 4
3 | 3
4 | 2
5 | 1
6 | 0
Run Code Online (Sandbox Code Playgroud)
如果我按数字升序排序,我得到:
select * from test order by number asc;
6 | 0
5 | 1
4 | 2
3 | 3
2 | 4
1 | 5
Run Code Online (Sandbox Code Playgroud)
如何对订单进行条带化以使其在每行的升序和降序之间交替?例如:
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
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
要么:
...
ORDER BY LEAST(rn_up, rn_down), number DESC;
Run Code Online (Sandbox Code Playgroud)
从更大的数字开始.
我一开始有两个CTE,但一个就足够了 - 更简单,更快.
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |