SQL 61) 输出first_name排名为奇数的first_name

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

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

一开始是用窗口函数做的,但是怎么都做不对...
SELECT a.first_name
FROM
( SELECT first_name, row_number()over(ORDER BY first_name)AS rank_num
FROM employees )a
WHERE a.rank_num%2 = 1;
因为实在是无法理解COUNT的做法,看了大家的评论说是
  • 题目中要求“输出的结果不需排序”……
因此修改了一下答案
SELECT
    e.first_name
FROM employees e JOIN
(
    SELECT 
        first_name
        , ROW_NUMBER() OVER(ORDER BY first_name ASC) AS  r_num
    FROM employees
) AS t 
ON e.first_name = t.first_name
WHERE t.r_num % 2 = 1;
加上表连结就能通过了(这样结果就不排序了)



SQL 文章被收录于专栏

SQL

全部评论
用emp_no连接时为什么会出现自动排序的情况呢
2 回复 分享
发布于 2021-08-06 19:47
逻辑有错,需要用工号链接才能准确 ON e.first_name = t.first_name 是用first链接的,谁能保证公司里只有一个“翠花”呢?
1 回复 分享
发布于 2021-09-17 17:59
按理说用t join e的话,应该是按照t表顺序输出,但结果还是按照e,请问是为什么呀?
1 回复 分享
发布于 2021-10-01 11:00
select b.first_name from ( select a.first_name,ROW_NUMBER() over(order by a.first_name) as rank_ from employees a ) b where b.rank_ % 2=1 先找出奇数列, 再通过select X from X where X in () 就可以不带排序了。 select c.first_name from employees c where c.first_name in ( select b.first_name from ( select a.first_name,ROW_NUMBER() over(order by a.first_name) as rank_ from employees a ) b where b.rank_ % 2=1 ) ;
15 回复 分享
发布于 2021-03-05 22:16
我不太明白为什么可以用first_name做key连结两个表,first_name 不是unique的,这样虽然产出结果是正确的,理论上并不对啊,如果有first_name 相同的,根本就得不出来正确结果啊。正常应该用primary key:emp_no连结两个表,但是连结之后结果还是排序过后的。
9 回复 分享
发布于 2021-04-05 04:48
子查询—用emp_no 查询避免重名情况 1.最内部先做好条件表 emp_no,row_number(对first_name排序,得到对应的emp_no以及顺序rankii) 2.然后找出排序为奇数的 emp_no 3.最后在总表中找出符合条件的姓名 4.内部表比较小,用in,速度最快 select first_name from employees where emp_no in (select emp_no from (select emp_no, row_number() over(order by first_name) as rankii from employees) as t where rankii % 2 = 1)
6 回复 分享
发布于 2021-06-11 16:04
但按理来说不应该用first_name进行表连接吧(以防有重名的情况),应该用emp_no;但是用emp_no编译不通过,进行了排序;很迷惑
4 回复 分享
发布于 2021-08-01 11:42
可以利用原表做子查询,first_name in 去掉排序
4 回复 分享
发布于 2021-11-13 16:22
SELECT a.first_name FROM ( SELECT first_name,emp_no, row_number()over(ORDER BY first_name)AS rank_num FROM employees )a WHERE a.rank_num%2 = 1 order by emp_no; 其实无论是count() 还是row)number()都是可以的,只不过题目要求按照最后要按照原来的顺序排而已
3 回复 分享
发布于 2022-08-15 12:46
666
点赞 回复 分享
发布于 2021-03-19 17:11
你好,能说一下join on为什么能按照原表输出吗?我把SELECT e.first_name 换成了t.first_name结果也是对的,有点搞不明白
点赞 回复 分享
发布于 2021-03-29 11:08
点赞 回复 分享
发布于 2021-06-16 17:41
为什么join on在emp_no字段的时候不能保持原表顺序呢?
点赞 回复 分享
发布于 2021-07-18 23:08
原来不需要排序是这个意思?
点赞 回复 分享
发布于 2021-07-28 21:15
with t as(select emp_no,row_number()over(order by first_name) as ranking from employees) select first_name from employees e join t on e.emp_no = t.emp_no where power(-1,ranking)<0; 我代码是这样写的,我看了一下,这跟你的不是一样的嘛,但是呢就是不给过,顺序不对,直到我加上了order by emp_no,才终于通过了,所以我觉得你这样写的写法也是有问题的,因为select选取结果,如果不加order by的话,提取出来的数据顺序是有不确定的https://blog.csdn.net/xxxxxwwwwww/article/details/113262005
点赞 回复 分享
发布于 2022-02-18 21:55
select first_name from employees where first_name in (select e.first_name from employees e join (select emp_no, row_number()over(order by first_name) rk from employees ) a on e.emp_no=a.emp_no where a.rk%2=1)
点赞 回复 分享
发布于 2022-03-14 13:21
这样修改下,第一个方法就可以实现。 SELECT a.first_name FROM ( SELECT first_name, row_number()over(ORDER BY first_name)AS rank_num FROM employees order by emp_no )a WHERE a.rank_num%2 = 1;
点赞 回复 分享
发布于 05-28 19:10 四川

相关推荐

99 8 评论
分享
牛客网
牛客企业服务