Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 第一最大第二最小排序_Sql_Algorithm_Sorting - Fatal编程技术网

Sql 第一最大第二最小排序

Sql 第一最大第二最小排序,sql,algorithm,sorting,Sql,Algorithm,Sorting,我有一个带有非唯一浮点数的表,我想以一种特殊的方式对它们进行排序,最大元素位于第一位,最小元素位于第二位,第二大元素位于第三位等等 1,2,3,4,5,6,7,8,9 我想点一份 1,9,2,8,3,7,4,6,5 UPD: 按行数升序和降序组合排序可以是一种解决方案,例如: select c, a, d, abs(a - d) from (select c, row_number() over (order by c) as a row_

我有一个带有非唯一浮点数的表,我想以一种特殊的方式对它们进行排序,最大元素位于第一位,最小元素位于第二位,第二大元素位于第三位等等

1,2,3,4,5,6,7,8,9
我想点一份

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

按行数升序和降序组合排序可以是一种解决方案,例如:

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语句下使用的表达式不应提供许多排序可能性

ANSI SQL支持行数。您可以通过巧妙地使用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;

这个例子实际上是leastseqnum_asc,seqnum_desc,但并非所有数据库都支持这种构造。

谢谢!我想我可以使用order by absseqnum_asc-seqnum_desc desc来删除案例construct@SergeyMalyutin . . . 您最初的问题没有指定如何处理重复的值。这个答案将它们交织在一起,这似乎是对这个问题的一个非常合理的解释。但是,如果要对它们进行分组,请使用稠密的秩或秩。即使是你编辑的问题也没有指定如何处理它们。