【问题标题】:How to sort a same column both in asc order and desc order如何按升序和降序对同一列进行排序
【发布时间】:2018-06-18 23:37:49
【问题描述】:

使用 SQL 查询,我们如何获得 2 列的输出,第一列是按 asc 顺序排序的列,第二个是按 desc 顺序排序的列,两者都是相同的列。

例如:

emp table:
empid
1 
5
9
4

查询输出应该是

empid_1   empid_2
1          9
4          5
5          4
9          1

到目前为止 OP 尝试了什么

WITH emp1 
     AS (SELECT ROWNUM a, 
                empno 
         FROM   (SELECT empno 
                 FROM   emp 
                 ORDER  BY 1 ASC)), 
     emp2 
     AS (SELECT ROWNUM b, 
                empno 
         FROM   (SELECT empno 
                 FROM   emp 
                 ORDER  BY 1 DESC)) 
SELECT emp1.empno, 
       emp2.empno 
FROM   emp1, 
       emp2 
WHERE  emp1.a = emp2.b; 

【问题讨论】:

  • @visakh: 以下是我尝试使用 emp1 as( select rownum a, empno from (select empno from emp order by 1 asc) ), emp2 as ( select rownum b, empno from ( select empno from emp order by 1 desc) ) select emp1.empno, emp2.​​empno from emp1, emp2 where emp1.a = emp2.​​b;
  • 请修改问题而不是评论。

标签: sql oracle11g


【解决方案1】:

您可以通过row_number() 和自我加入来做到这一点:

select e1.empid as empid_1, e2.empid as empid_2
from (select e.*, row_number() over (order by emp_id) as seqnum
      from emp e
     ) e1 join
     (select e.*, row_number() over (order by emp_id desc) as seqnum
      from emp e
     ) e2
     on e1.seqnum = e2.seqnum;

编辑:

您也可以使用rownum 执行此操作,但需要额外的select

select e1.empid as empid_1, e2.empid as empid_2
from (select e.*, rownum as seqnum
      from (select e.* from emp e order by empid asc) e
     ) e1 join
     (select e.*, rownum as seqnum
      from (select e.* from emp e order by empid desc) e
     ) e2
     on e1.seqnum = e2.seqnum;

【讨论】:

  • +1 表示速度非常快,只是想rownum :)
  • rownum 版本不能像所写的那样工作 - 您需要嵌套选择,以便在 rownum 之后应用 rownum - 目前它在之前。
【解决方案2】:

如果您使用公用表表达式/子查询因式分解子句,那么您只需访问该表一次:

with the_data as (
 select empid
      , row_number() over ( order by empid ) as id_asc
      , row_number() over ( order by empid desc ) as id_desc
   from emp
        )
select a.empid as empid_asc
     , d.empid as empid_desc
  from the_data a
  join the_data d
    on a.id_asc = d.id_desc

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2016-10-18
    • 2018-05-03
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2022-01-15
    相关资源
    最近更新 更多