第一个最大第二分钟订购

时间:2015-04-13 14:12:16

标签: sql algorithm sorting

我有一个浮动非唯一数字的表,我想以一种特殊的方式对它们进行排序,即max元素将位于第1位,min元素位于第2位,第2位元素位于3位rd place等。例如,

1,2,3,4,5,6,7,8,9

我想订购

1,9,2,8,3,7,4,6,5

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)

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

c | a | d
4 | 1 | 4 | 3
4 | 2 | 5 | 3
5 | 3 | 1 | 2
5 | 4 | 2 | 2
5 | 5 | 3 | 2

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

1 个答案:

答案 0 :(得分: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;

case实际上是least(seqnum_asc, seqnum_desc),但并非所有数据库都支持该构造。