我有一个浮动非唯一数字的表,我想以一种特殊的方式对它们进行排序,即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语句下使用的表达式不应提供许多排序可能性
答案 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)
,但并非所有数据库都支持该构造。