题解 | #给出employees表中排名为奇数行的first_name#

给出employees表中排名为奇数行的first_name

https://www.nowcoder.com/practice/e3cf1171f6cc426bac85fd4ffa786594

这道题目要求我们给出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;
全部评论
关联键这样写会导致数据膨胀的,这样写才对:select t1.first_name from employees t1 inner join ( select first_name ,emp_no from ( select first_name ,emp_no ,row_number() over(order by first_name asc) as rn from employees )t1 where rn % 2 = 1 )t2 on t1.emp_no = t2.emp_no;
点赞 回复 分享
发布于 10-11 15:23 上海
下边的这个计算余数的为啥不用Having呀 大佬
点赞 回复 分享
发布于 10-09 18:16 山东

相关推荐

不愿透露姓名的神秘牛友
12-08 17:10
拼多多 算法 38x18 大专
李橙子:你的白菜价我做梦都遥不可及
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务