这道题目要求我们给出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;