最难理解的是 排序按照升序 取出奇数行 输出的时候不排序 就是按照原表排序
--窗口函数 计算出排名
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