简单的面试sql题求解

实习导演 发布于 2014/10/14 22:41
阅读 672
收藏 5

数据表如下:

classroom(教室) grade(等级) student(学生)
1 a 1
1 a 2
1 a 3
1 a 4
1 b 5
1 b 6
1 b 7
1 c 8
1 d 9
问题来了:

从教室为1的每个等级中取出前两名学生。这个sql该怎么写?


以下是问题补充:

@实习导演:mysql (2014/10/14 22:54)
加载中
1
牛奋Debug
牛奋Debug

参考这篇文章:

http://hidba.org/?p=295

疯狂的流浪
疯狂的流浪
学习了,感觉还有点不懂,不过mysql可以搞这么屌,牛
实习导演
实习导演
thx
0
凤城回忆
凤城回忆
用分析函数分分钟搞定
疯狂的流浪
疯狂的流浪
第一次听说这个东西,向大神学习了。
dreamers
dreamers
的确是,用了Oracle及PostgreSQL的分析函数或窗口函数,感觉MySQL弱爆了。
实习导演
实习导演
哦?
0
飘逸的逸
飘逸的逸
如果是Oracle的话,用分析函数根据前两个字段聚合排序,在取前两条记录。
实习导演
实习导演
是mysql 哈哈
0
0
小99
小99
啥数据库
实习导演
实习导演
mysql数据库
0
Scholer
Scholer
SELECT * FROM table a
WHERE 2 >(SELECT count(*) FROM table WHERE grade = a.grade and student<a.student)
AND classroom = 1
ORDER BY a.grade,a.student ASC;



dreamers
dreamers
回复 @Scholer : 测试大量数据时,这条sql效率非常低呀。。
dreamers
dreamers
回复 @Scholer : 哈哈,可以运行正确。。。
Scholer
Scholer
回复 @实习导演 : 修正了下
Scholer
Scholer
回复 @dreamers : where 是手误 已改
dreamers
dreamers
而且你这表达的意思,是count必须>2,那c,d不要了?
下一页
0
zy643208
zy643208
每个等级中取出前两名学生,这个前两名是怎么定义的?
实习导演
实习导演
不管怎么排序 取出前两个就好了。。thx
0
dreamers
dreamers

来一发PG的。哈哈

select * from ( select row_number() over (partition by t_1.grade order by t_1.student asc ) as rownum, * from t_1) as te where te.rownum < 3;

0
dreamers
dreamers
with cte as (
select row_number() over (partition by t_1.grade order by t_1.student desc) as row_num, * from t_1;
)
select * from cte where cte.row_num < 3;
返回顶部
顶部