题目描述
(通过次数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;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。