【问题标题】:How to sort a same column both in ASC & DESC order without duplicates如何以 ASC 和 DESC 顺序对同一列进行排序而不重复
【发布时间】:2018-06-18 15:31:58
【问题描述】:

使用 SQL 查询,我们如何获得两列的输出,第一列是按 ASC 顺序排序的列,第二列是按 DESC 顺序排序的列,没有任何重复值,并且都是相同的列。

EMP 表:

EMP_NAME
Megha
Vicky
Neha
Sachin
Neha

查询输出应该是

EMP_NAME_ASC    EMP_NAME_DESC
Megha           Vicky
Neha            Sachin
Sachin          Neha
Vicky           Megha

我尝试了以下解决方案 How to sort a same column both in asc order and desc order

但这并没有给我独特的价值观。 任何帮助,将不胜感激。 提前谢谢你。

【问题讨论】:

  • 对我来说听起来像是数据谬误。如何构建这样的东西?
  • 这是一个奇怪的要求。
  • 感觉应该在后端代码中做一些事情,而不是在数据库中。

标签: sql sql-server sql-server-2008


【解决方案1】:

对 Gordon Linoff 的回答稍作修改,您可以获得不同的名称:

;WITH
    cte AS
    (
        SELECT      EMP_NAME
                ,   DENSE_RANK() OVER (ORDER BY EMP_NAME ASC)       AS RankAsc
                ,   DENSE_RANK() OVER (ORDER BY EMP_NAME DESC)      AS RankDesc
                ,   ROW_NUMBER() OVER (PARTITION BY EMP_NAME ORDER BY EMP_NAME)
                                                                    AS RowNumber
        FROM        #EMP
    )

SELECT      cte1.EMP_NAME       AS EMP_NAME_ASC
        ,   cte2.EMP_NAME       AS EMP_NAME_DESC
FROM        cte         cte1
INNER JOIN  cte         cte2    ON cte1.RankAsc = cte2.RankDesc
WHERE       cte1.RowNumber = 1
        AND cte2.RowNumber = 1

ROW_NUMBER 在每次出现相同名称时都会给出一个序列号。第一次出现Neha 时会得到1,第二次出现时会得到2,以此类推。我们对每个名称第一次出现的时间感兴趣,因此只获取不同的名称。

【讨论】:

    【解决方案2】:

    您是列中的两个单独列表。这不是一种类似于 SQL 的数据存储方式——行没有任何意义。但是你可以这样做,使用row_number():

    select a.name, d.name
    from (select name, row_number() over (order by name asc) as seqnum
          from t
         ) a join
         (select name, row_number() over (order by name desc) as seqnum
          from t
         ) d 
         on a.seqnum = d.seqnum;
    

    【讨论】:

    • 是的,这不是存储数据的正确方法,但这是一项功能所需的奇怪要求。我尝试了您的查询,但它没有给我两列上不同值的输出。
    猜你喜欢
    • 2021-12-13
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多