这道题目要求我们给出employees表中排名为奇数行的first_name,我们要做的事情如下:
1. 确定总体问题
我们需要从员工表中提取名字,并按照名字的字母顺序排序后,输出排名为奇数的名字。
2. 分析关键问题
- 排序名字并分配排名:使用
ROW_NUMBER
窗口函数按照名字的字母顺序为每个名字分配一个排名。 - 筛选奇数排名的名字:通过
WHERE
子句筛选出排名为奇数的名字。
3. 解决每个关键问题的代码及讲解
步骤1:排序名字并分配排名
我们使用ROW_NUMBER
窗口函数按照名字的字母顺序为每个名字分配一个排名:
select
first_name,
row_number() over(order by first_name asc) as rk
from employees
ROW_NUMBER() OVER (ORDER BY first_name ASC) AS rk
:为每个名字分配一个排名,按照名字的字母顺序。
步骤2:筛选奇数排名的名字
我们通过WHERE
子句筛选出排名为奇数的名字:
select
e.first_name as Georgi
from
employees e
join
(
--子函数
) sub on e.first_name = sub.first_name
where
rk%2!=0
WHERE rk % 2 != 0
:筛选出排名为奇数的名字。- 因为直接排序后输出会导致顺序变化,而题目要求原顺序输出,所以使用表连接。
- 注意表连接和排序保持一致,否则容易导致顺序改变。
完整代码
select
e.first_name as Georgi
from
employees e
join
(
select
first_name,
row_number() over(order by first_name asc) as rk
from employees
) sub on e.first_name = sub.first_name
where
rk%2!=0;