SQL - 如何按特殊顺序对值进行排序?

SQL - How to sort values in special order?

例如,我有一个按“代码”列排序的 table。此外,我现在准确地确定了 table 的行数(本例为 6)。 我需要使用下一条规则再创建一个具有等级的列:

  1. 第一个值有第一个代码(1)
  2. 第二个值有最后一个代码 (6)
  3. 第三个值有第二个代码(2)
  4. 第四个值有倒数第二个代码(5)等

如何创建此订单?即使你只是一个想法没有疑问,请与我分享。

您可以使用:

WITH cte AS (
  SELECT *, ROW_NUMBER() OVER(ORDER BY code ASC) rn1,
            ROW_NUMBER() OVER(ORDER BY code DESC) rn2
  FROM tab
)
SELECT *
FROM cte
ORDER BY ABS(rn2 - rn1) DESC, code;

db<>fiddle demo

工作原理:两个基于代码的计数器,计算差值,因此 first 和 last 具有相同的值,当 tie 更喜欢代码时。

我也会用row_number(),但我认为你想要的逻辑更多:

select *
from (
    select t.*,
        row_number() over(order by code asc ) rn_asc,
        row_number() over(order by code desc) rn_desc
    from tab t
) t
order by case when rn_asc <= rn_desc then rn_asc else rn_desc end, rn_asc;

这对记录进行双向排名,然后使用两个排名中最小的排名进行排序。第二个排序标准确保两者中的最小值始终排在第一位。