8

次のテーブルがあるとします。

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

行ごとに昇順と降順が交互になるように順序をストライプ化するにはどうすればよいですか? 例えば:

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
4

2 に答える 2

5

アップデート

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;

大きい数字から始めます。

私は最初に2つのCTEを持っていましたが、1つで十分です-よりシンプルで高速です。

于 2012-05-02T18:22:37.267 に答える
2

または、このように(すでに与えられた答えに似ていますが、少し短い:)

WITH x AS (
    SELECT *, row_number() OVER (ORDER BY number) rn, count(*) over () as c
    FROM test
    )
SELECT id, number
FROM x 
ORDER BY ABS((c + 1.5) / 2 - rn) DESC;

逆の順序が必要な場合は、

ORDER BY ABS((c + 0.5) / 2 - rn) DESC;
于 2012-05-02T18:56:16.493 に答える