SQL - 如何按特殊顺序对值进行排序?
SQL - How to sort values in special order?
例如,我有一个按“代码”列排序的 table。此外,我现在准确地确定了 table 的行数(本例为 6)。
我需要使用下一条规则再创建一个具有等级的列:
- 第一个值有第一个代码(1)
- 第二个值有最后一个代码 (6)
- 第三个值有第二个代码(2)
- 第四个值有倒数第二个代码(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;
工作原理:两个基于代码的计数器,计算差值,因此 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;
这对记录进行双向排名,然后使用两个排名中最小的排名进行排序。第二个排序标准确保两者中的最小值始终排在第一位。
例如,我有一个按“代码”列排序的 table。此外,我现在准确地确定了 table 的行数(本例为 6)。 我需要使用下一条规则再创建一个具有等级的列:
- 第一个值有第一个代码(1)
- 第二个值有最后一个代码 (6)
- 第三个值有第二个代码(2)
- 第四个值有倒数第二个代码(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;
工作原理:两个基于代码的计数器,计算差值,因此 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;
这对记录进行双向排名,然后使用两个排名中最小的排名进行排序。第二个排序标准确保两者中的最小值始终排在第一位。