第一个最大第二分钟订购

Ser*_*tin 2 sql sorting algorithm

我有一个浮动非唯一数字的表,我想以一种特殊的方式对它们进行排序,即最大元素位于第1位,第2位为最小元素,第3位为第二大元素,等等.例如,

1,2,3,4,5,6,7,8,9
Run Code Online (Sandbox Code Playgroud)

我想订购

1,9,2,8,3,7,4,6,5
Run Code Online (Sandbox Code Playgroud)

UPD:

通过row_number()上升和下降的排序组合可以是解决方案,例如

select c, a, d, abs(a - d)
from (select c,
             row_number() over (order by c) as a
             row_number() over (order by c desc) as d
      from t) 
order by abs(a - d)
Run Code Online (Sandbox Code Playgroud)

但是你应该记住,由于非唯一数字,你可以遇到一些问题,上面的解决方案不适用于下面的例子

c | a | d
4 | 1 | 4 | 3
4 | 2 | 5 | 3
5 | 3 | 1 | 2
5 | 4 | 2 | 2
5 | 5 | 3 | 2
Run Code Online (Sandbox Code Playgroud)

这意味着在OVER语句下使用的表达式不应提供许多排序可能性

Gor*_*off 6

ANSI SQL支持row_number().您可以通过row_number()巧妙的方式使用:

select t.*
from (select t.*,
             row_number() over (order by col) as seqnum_asc
             row_number() over (order by col desc) as seqnum_desc
      from table t
     ) t
order by (case when seqnum_asc <= seqnum_desc then seqnum_asc else seqnum_desc end),
         col desc;
Run Code Online (Sandbox Code Playgroud)

case是真的least(seqnum_asc, seqnum_desc),但不是所有的数据库都支持该结构.