题目描述

(通过次数901 | 提交次数1,458,通过率61.80%)

表:Data
+-------------+------+
| Column Name | Type |
+-------------+------+
| first_col   | int  |
| second_col  | int  |
+-------------+------+
该表没有主键且可能包含重复数据。

请你编写 SQL 使:
first_col 按照 升序 排列。
second_col 按照 降序 排列。

查询返回的结果格式如下。
示例:
输入:
Data 表:
+-----------+------------+
| first_col | second_col |
+-----------+------------+
| 4         | 2          |
| 2         | 3          |
| 3         | 1          |
| 1         | 4          |
+-----------+------------+
输出:
+-----------+------------+
| first_col | second_col |
+-----------+------------+
| 1         | 4          |
| 2         | 3          |
| 3         | 2          |
| 4         | 1          |
+-----------+------------+

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/order-two-columns-independently
//测试数据
Create table If Not Exists Data (first_col int, second_col int);

insert into Data (first_col, second_col) values ('4', '2');
insert into Data (first_col, second_col) values ('2', '3');
insert into Data (first_col, second_col) values ('3', '1');
insert into Data (first_col, second_col) values ('1', '4');

解题思路

Data表有两列数据。题目要求:第一列按升序返回,第二列按降序返回。
注意,这里并不是说先按第一列升序排序,再按第二列降序排序。而是第一列和第二列分别排序,然后合并结果到一个结果集中返回。
如果第一列的某个值与第二列的某个值在返回结果的同一行,那么第一列值的升序排序序号与第二列值的降序排序序号肯定是相同的。
既然第一列和第二列分别排序,那么,我们可以使用窗口函数计算出这两个字段分别排序后的序号。最后使用排序序号自关联,得出需要返回的格式。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
with
tmp as (
    select
        first_col,
        second_col,
        row_number() over(order by first_col) rn_first,
        row_number() over(order by second_col desc) rn_second
    from Data
)
select
    a.first_col,
    b.second_col
from tmp a
inner join tmp b
on a.rn_first = b.rn_second
order by a.rn_first;

picture loss