一、数据
表: Genders
+-------------+---------+ | Column Name | Type | +-------------+---------+ | user_id | int | | gender | varchar | +-------------+---------+ user_id 是该表的主键(具有唯一值的列)。 gender 的值是 'female', 'male','other' 之一。 该表中的每一行都包含用户的 ID 及其性别。 表格中 'female', 'male','other' 数量相等。
编写一个解决方案以重新排列 Genders
表,使行按顺序在 'female'
, 'other'
和 'male'
之间交替。同时每种性别按照 user_id 升序进行排序。
按 上述顺序 返回结果表。
返回结果格式如以下示例所示。
示例 1:
输入: Genders 表: +---------+--------+ | user_id | gender | +---------+--------+ | 4 | male | | 7 | female | | 2 | other | | 5 | male | | 3 | female | | 8 | male | | 6 | other | | 1 | other | | 9 | female | +---------+--------+ 输出: +---------+--------+ | user_id | gender | +---------+--------+ | 3 | female | | 1 | other | | 4 | male | | 7 | female | | 2 | other | | 5 | male | | 9 | female | | 6 | other | | 8 | male | +---------+--------+ 解释: 女性:ID 3、7、9。 其他性别:ID 1、2、6。 男性:ID 4、5、8。 我们在 'female', 'other','male' 之间交替排列表。 注意,每种性别都是按 user_id 升序排序的。
二、分析
本题的解法是可以使用窗口函数让数据按照gender分组,然后按照user_id进行分组,就会形成以下数据:
然后将其作为一个临时表,在主查询中让数据按照RK和gender正序排序。
三、代码
with t1 as (
select user_id, gender,
row_number() over (partition by gender order by user_id) rk
from genders
)
select user_id,gender,rk
from t1
order by rk,gender;
四、总结
注意:
因为在创建表时,gender为Enum枚举类型,然后当对其进行排序时,正序排序就时按照定义的顺序,即:
Create table If Not Exists Genders (user_id int, gender ENUM('female', 'other', 'male'));
当对gender进行正序排序时:female为最小,male为最大。
标签:2308,表格,gender,力扣,other,user,female,male,id From: https://blog.csdn.net/dhdbanwan/article/details/143866469