题解 | #对于employees表中,给出奇数行的first_name#

对于employees表中,给出奇数行的first_name

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

最难理解的是 排序按照升序 取出奇数行 输出的时候不排序 就是按照原表排序

--窗口函数  计算出排名
with temp as(select 
    e.first_name,
    dense_rank() over (order by e.first_name ) as name_rank
from
    employees e
)
--同学们用窗口函数 没join直接输出 就是结果集对 但是顺序不对 ,
--因为题目说的是不排序输出,就是原表顺序输出
--join的原因  ;他会拿 前面的表就是原表 的第一行 去和 咋们的临时查询的 temp表去比较 依次比较 第二 第三行   所以顺序是 原表顺序
select 
    t.first_name
FROM
    employees e
join
    temp t
on
    e.first_name=t.first_name
WHERE
    t.name_rank%2!=0


--这是别人的写法,写的是真巧妙  但是我觉得他这个有点漏洞,就是不应该在比较上加上=号 ,有重名就会有bug    
-- 他在where里面有一个子查询 ,这个子查询的目的是什么 找到原表当前行的排名
-- e.first_name> e2.first_name   就是比当前name 小的有几行 
-- 不要加上等号 但是要在count(*)+1 这样排名就从一开始  重名也无所谓
--如果这样写 e.first_name>=e2.first_name    这样是有问题存在的   重名问题
-- 例子:  表里面first_name字段数据是这样    yzq   yzq    aa     
--那么俩个yzq的排名就是 3      aa的排名就是 1  这样就跳过了2  所以=要去掉。
--=去掉之后 再count(*)+1从这样  俩个yzq的排名 就是 2    aa排名就是 1 这样就不会出现问题了      
# SELECT
#     e.first_name
# from 
#     employees e
# WHERE
#     (select count(*) from employees e2
#      where e.first_name> e2.first_name) %2!=0
全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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