对于以下示例表,我想按 start_date desc 为每个组设置排名,但我希望管理员始终设置为排名 0
姓名 | 开始日期 | 群组编号 |
---|---|---|
行政 | 2023-01-01 | 0 |
一个 | 2021-01-01 | 0 |
乙 | 2022-01-01 | 0 |
碳 | 2021-06-01 | 0 |
行政 | 2021-01-01 | 1 |
一个 | 2025-01-01 | 1 |
乙 | 2020-01-01 | 1 |
碳 | 2024-01-01 | 1 |
预期结果:
姓名 | 开始日期 | 群组编号 | 陣容 |
---|---|---|---|
行政 | 2023-01-01 | 0 | 0 |
乙 | 2022-01-01 | 0 | 1 |
碳 | 2021-06-01 | 0 | 2 |
一个 | 2021-01-01 | 0 | 3 |
行政 | 2021-01-01 | 1 | 0 |
一个 | 2025-01-01 | 1 | 1 |
碳 | 2024-01-01 | 1 | 2 |
乙 | 2020-01-01 | 1 | 3 |
SELECT name, start_date, group_no,
RANK() OVER (PARTITION BY group_no ORDER by start_date DESC) as rnk
FROM Table_Name
ORDER BY rnk;
上述查询给出了以下结果。有没有办法可以在排名函数上添加一个条件,以默认将管理员设置为 0,并将排名函数应用于其他所有内容。
姓名 | 开始日期 | 群组编号 | 陣容 |
---|---|---|---|
行政 | 2023-01-01 | 0 | 1 |
乙 | 2022-01-01 | 0 | 2 |
碳 | 2021-06-01 | 0 | 3 |
一个 | 2021-01-01 | 0 | 4 |
一个 | 2025-01-01 | 1 | 1 |
碳 | 2024-01-01 | 1 | 2 |
行政 | 2021-01-01 | 1 | 3 |
乙 | 2020-01-01 | 1 | 4 |
我也尝试过使用案例条件:
SELECT name, start_date, group_no,
CASE WHEN name = 'Admin' THEN 0
ELSE RANK() OVER (PARTITION BY group_no ORDER by start_date DESC)
END as rnk
FROM Table_Name
ORDER BY rnk;
姓名 | 开始日期 | 群组编号 | 陣容 |
---|---|---|---|
行政 | 2023-01-01 | 0 | 0 |
乙 | 2022-01-01 | 0 | 2 |
碳 | 2021-06-01 | 0 | 3 |
一个 | 2021-01-01 | 0 | 4 |
在这种情况下,管理员设置为 0,但后续行的排名从 2 开始,而不是从 1 开始。
我的另一个选择是使用以下方法,它可以完成这项工作,但是有没有更好的方法呢?
SELECT name, start_date, group_no,
0 as rnk
FROM Table_Name
WHERE name = 'Admin'
UNION
SELECT name, start_date, group_no,
RANK() OVER (PARTITION BY group_no ORDER by start_date DESC) as rnk
FROM Table_Name
WHERE name <> 'Admin'