论坛首页 综合技术论坛

一道淘宝的考察sql语句的面试题

浏览 55202 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-09  
mysql:
select * from user order by gender, grade desc limit 10
0 请登录后投票
   发表时间: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
 

不错!!!

0 请登录后投票
   发表时间: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;
0 请登录后投票
   发表时间: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)
这个不是想要的结果吗?

大数据量的情况下执行效率太低
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-05-10  
看了回贴,发现考虑的内容少了,哈哈。题干表述的确也是不大明确
0 请登录后投票
   发表时间: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,这个回答已经很全面了
0 请登录后投票
   发表时间: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
 

不错!!!


非oracle的话,这条SQL还可以,不过数据量大的话还是有性能问题,用存储过程拆开前五的grade的值也是一种方案。

0 请登录后投票
   发表时间:2011-05-11  
呵呵,大家的思路都很好,不过我觉得这个问题用union足够了,好理解,性能也过得去
0 请登录后投票
   发表时间: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么?

我看不懂。。。

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics