锁定老帖子 主题:一道淘宝的考察sql语句的面试题
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-09
mysql:
select * from user order by gender, grade desc limit 10 |
|
返回顶楼 | |
发表时间:2011-05-09
isaacfu_454 写道
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc 不错!!! |
|
返回顶楼 | |
发表时间:2011-05-09
select * from (select a.* ,row_number() over(partiton by a.gender order by a.grade) rn from t_stu)t where t.rn < 6;
|
|
返回顶楼 | |
发表时间:2011-05-09
xiangzi21 写道 (select * from t_stu where gender = 0 order by grade desc limit 5)
union all (select * from t_stu where gender = 1 order by grade desc limit 5) 这个不是想要的结果吗? 大数据量的情况下执行效率太低 |
|
返回顶楼 | |
发表时间:2011-05-09
不会数据库分析函数,oracle数据库,常规写法,仅实现功能,未考虑效率问题
查询出分数前5的男生和分数前5的女生,不论人数有多少,只要满足分数前5,都查出来 SELECT * FROM T_STU T WHERE (T.GRADE IN (SELECT S1.GRADE FROM ( SELECT DISTINCT(T1.GRADE) FROM T_STU T1 WHERE T1.GENDER=1 ORDER BY T1.GRADE DESC) S1 WHERE ROWNUM<=5) AND T.GENDER=1) OR (T.GRADE IN (SELECT S2.GRADE FROM ( SELECT DISTINCT(T2.GRADE) FROM T_STU T2 WHERE T2.GENDER=0 ORDER BY T2.GRADE DESC) S2 WHERE ROWNUM<=5) AND T.GENDER=0) ORDER BY T.GENDER,GRADE DESC |
|
返回顶楼 | |
发表时间:2011-05-10
看了回贴,发现考虑的内容少了,哈哈。题干表述的确也是不大明确
|
|
返回顶楼 | |
发表时间:2011-05-11
czwlucky 写道 小小风信子 写道 如果是使用oracle的话,应该是考查分析函数和开窗函数的使用,最近一直在写这个,现在给出oracle的写法:
CREATE TABLE T_STU( ID NUMBER(38) PRIMARY KEY, NAME VARCHAR2(20), GENDER NUMBER(1), GRADE NUMBER(4) ); insert into t_stu values(1,'Alex',1,91); insert into t_stu values(2,'Elena',0,92); insert into t_stu values(3,'Alex2',1,92); insert into t_stu values(4,'Elena2',1,92); insert into t_stu values(5,'Alex3',1,98); insert into t_stu values(6,'Elena3',1,98); insert into t_stu values(7,'Alex4',1,98); insert into t_stu values(8,'Elena4',1,92); insert into t_stu values(9,'Alex5',1,51); insert into t_stu values(10,'Elena5',0,90); insert into t_stu values(11,'Alex6',1,90); insert into t_stu values(12,'Elena6',0,90); insert into t_stu values(13,'Elena7',0,89); insert into t_stu values(14,'Elena8',0,87); insert into t_stu values(15,'Alex5',1,60); insert into t_stu values(16,'Alex5',1,70); SELECT * FROM (SELECT s.*, DENSE_RANK() OVER(PARTITION BY s.gender ORDER BY s.grade DESC) dro FROM t_stu s ) t WHERE t.dro <= 5 下面的图片是执行sql后的效果,当然最后一列是不需要的,这里显示只是为了让你明白 [img] [/img] 不知道前五名是如何定义的,可以参考三个分析函数进行查询,具体使用哪一个,就看是如何定义这个“前五名”的。 row_number() 按序分配序列,如: 1, 2 ,3 ,4 ,5 rank() 并列排名会占取下一个名次,如: 1, 2, 2, 4, 5 dense_rank() 并列名次不会占取下一名次,如:1, 2, 2, 3, 4, 5 +1,这个回答已经很全面了 |
|
返回顶楼 | |
发表时间:2011-05-11
denny9527 写道
isaacfu_454 写道
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc 不错!!!
|
|
返回顶楼 | |
发表时间:2011-05-11
呵呵,大家的思路都很好,不过我觉得这个问题用union足够了,好理解,性能也过得去
|
|
返回顶楼 | |
发表时间:2011-05-11
isaacfu_454 写道
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc 能解释下这段SQL么? 我看不懂。。。 |
|
返回顶楼 | |