+-------------+---------+
|Column Name |Type|+-------------+---------+
| user_id | int || gender | varchar |+-------------+---------+
user_id is the primarykey (columnwithuniquevalues) for this table.
gender is ENUM (category) oftype'female', 'male', or'other'.
Eachrowin this tablecontains the ID of a userand their gender.
The table has an equal number of'female', 'male', and'other'.
Write a solution to rearrange the Genders table such that the rows alternate between 'female', 'other', and 'male' in order. The table should be rearranged such that the IDs of each gender are sorted in ascending order.
Return the result table in the mentioned order.
The result format is shown in the following example.
Input:
Genders table:
+---------+--------+
| user_id | gender |+---------+--------+
|4| male ||7| female ||2| other ||5| male ||3| female ||8| male ||6| other ||1| other ||9| female |+---------+--------+
Output:
+---------+--------+
| user_id | gender |+---------+--------+
|3| female ||1| other ||4| male ||7| female ||2| other ||5| male ||9| female ||6| other ||8| male |+---------+--------+
Explanation:
Female gender: IDs 3, 7, and9.
Other gender: IDs 1, 2, and6.
Male gender: IDs 4, 5, and8.
We arrange the table alternating between'female', 'other', and'male'.
Note that the IDs ofeach gender are sorted in ascending order.
We need to alternate rows by gender in the order ‘female’, ‘other’, ‘male’, with IDs of each gender sorted. Assign a row number to each gender group, then join them by row number and output in the required order.
WITH female AS (
SELECT user_id, gender, ROW_NUMBER() OVER (ORDERBY user_id) AS rn
FROM Genders WHERE gender ='female' ),
other AS (
SELECT user_id, gender, ROW_NUMBER() OVER (ORDERBY user_id) AS rn
FROM Genders WHERE gender ='other' ),
male AS (
SELECT user_id, gender, ROW_NUMBER() OVER (ORDERBY user_id) AS rn
FROM Genders WHERE gender ='male' )
SELECT user_id, gender FROM (
SELECT f.rn, f.user_id, f.gender FROM female f
UNIONALLSELECT o.rn, o.user_id, o.gender FROM other o
UNIONALLSELECT m.rn, m.user_id, m.gender FROM male m
) t
ORDERBY rn, FIELD(gender, 'female', 'other', 'male');