【问题标题】:How to select the same column twice with different order如何以不同的顺序选择同一列两次
【发布时间】:2015-10-03 01:43:18
【问题描述】:

这是我的问题。我需要在同一个选择中以不同的方式订购同一个列。先升序后降序。

例子:

表 1

+--------+-----+
| Name   | Age |
+--------+-----+
| Coa    | 20  |
| Bami   | 12  |
| Alice  | 50  |
+--------+-----+

结果应该是:

+------+-----+
| Age  | Age |
+------+-----+
| 12   | 50  |
| 20   | 20  |
| 50   | 12  |
+------+-----+

我希望同一列先排序上升,然后排序下降。

我在努力

查询

Select t1.age, t2.age
from table1 t1 
inner join table1 t2 
on t1.name=t2.name
order by t1.age asc, t2.age desc

但在结果中,两列的排序方式相同。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是一个非常奇怪的要求。你可以使用row_number() 和一个连接来做到这一点:

    select t1a.age, t1b.age
    from (select t1.*, row_number() over (order by age asc) as seqnum
          from table1 t1
         ) t1a join
         (select t1.*, row_number() over (order by age desc) as seqnum
          from t1
         ) t1b
         on t1a.seqnum = t1b.seqnum
    order by t1a.age;
    

    【讨论】:

    • 谢谢!问题解决了!但我仍然试图理解为什么我的命令中的“order by”即使指定以不同的方式执行,也是以相同的顺序进行的。
    • @DuroForce 。 . . order by 键按每个键对 rows 进行排序。第二个键仅用于与第一个键具有相同值的行。
    【解决方案2】:

    SQL Fiddle Demo

    WITH CTE AS
    (
        SELECT NAME,
                AGE,
                ROW_NUMBER() OVER(ORDER BY AGE ASC) AS AC,
                ROW_NUMBER() OVER(ORDER BY AGE DESC) AS DC
        FROM YOURTABLE
    )
    
    SELECT C1.AGE,C2.AGE
    FROM CTE C1 
            INNER JOIN CTE C2 ON C1.AC=C2.DC
    

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多