一个学生表 学号 姓名 班级 成绩
01 张三 1 90
02 李四 2 80
03 王五 1 91
04 赵六 1 86
05 孙七 2 88
06 王八 2 60
我想先按照班级分组,在按照成绩取出前二名学生,得到以下结果:
学号 姓名 班级 成绩
03 王五 1 91
01 张三 1 90
02 李四 2 80
05 孙七 2 88谢谢!
01 张三 1 90
02 李四 2 80
03 王五 1 91
04 赵六 1 86
05 孙七 2 88
06 王八 2 60
我想先按照班级分组,在按照成绩取出前二名学生,得到以下结果:
学号 姓名 班级 成绩
03 王五 1 91
01 张三 1 90
02 李四 2 80
05 孙七 2 88谢谢!
SELECT 学号, 姓名, 班级, 成绩
FROM (SELECT 学号,
姓名,
班级,
成绩,
DENSE_RANK() OVER(PARTITION BY 班级 ORDER BY 成绩 DESC) ROW_
FROM TABLE_NAME)
WHERE ROW_ <= 2;
--简单写了下,应该还有更简单的写法
create table cc_a(no varchar2(10),name varchar2(20),class number, grade number);
SELECT t1.no, t1.NAME, t1.CLASS, t1.grade
FROM (SELECT t.no, t.NAME, t.CLASS, t.grade
FROM cc_a t
WHERE CLASS = 1
AND rownum < 3
ORDER BY grade DESC) t1
UNION ALL
SELECT t2.no, t2.NAME, t2.CLASS, t2.grade
FROM (SELECT t.no, t.NAME, t.CLASS, t.grade
FROM cc_a t
WHERE CLASS = 2
AND rownum < 3
ORDER BY grade DESC) t2;--结果
1 03 王五 1 91
2 01 张三 1 90
3 05 孙七 2 88
4 02 李四 2 80
SELECT *
FROM STU A
WHERE EXISTS (SELECT * FROM STU WHERE SCORE > A.SCORE HAVING COUNT(1) < 2)
ORDER BY SCORE DESC;
SELECT t.no, t.NAME, t.CLASS, t.grade
FROM (SELECT t.no, t.NAME, t.CLASS, t.grade,
DENSE_RANK() OVER(PARTITION BY t.CLASS ORDER BY t.grade DESC) ROW_
FROM cc_a t) t
WHERE ROW_ <= 2;
--very good