1.建表語句,插入數據:
create table TEST_SCORE
(
CLASS VARCHAR(10),
NAME VARCHAR(10),
SCORE INTEGER
);
INSERT INTO test_score ( class, name, score) VALUES ( '1班', '齊靜春', 100);
INSERT INTO test_score ( class, name, score) VALUES ( '1班', '李二', 99);
INSERT INTO test_score ( class, name, score) VALUES ( '1班', '陳平安', 88);
INSERT INTO test_score ( class, name, score) VALUES ( '1班', '李柳', 98);
INSERT INTO test_score ( class, name, score) VALUES ( '1班', '趙耀', 79);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '嶽東江', 81);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '蘇傑', 69);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '吳傑', 87);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '王珂', 77);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '杜蘭特', 99);
INSERT INTO test_score ( class, name, score) VALUES ( '2班', '羅斯', 90);
INSERT INTO test_score ( class, name, score) VALUES ( '3班', '馬祖號', 69);
INSERT INTO test_score ( class, name, score) VALUES ( '3班', '王祖輝', 89);
INSERT INTO test_score ( class, name, score) VALUES ( '3班', '林沖', 91);
INSERT INTO test_score ( class, name, score) VALUES ( '3班', '趙卡', 80);
INSERT INTO test_score ( class, name, score) VALUES ( '3班', '羅帥', 87);
INSERT INTO test_score ( class, name, score) VALUES ( '4班', '陳旭', 77);
INSERT INTO test_score ( class, name, score) VALUES ( '4班', '王豔', 71);
INSERT INTO test_score ( class, name, score) VALUES ( '4班', '呼呼', 89);
INSERT INTO test_score ( class, name, score) VALUES ( '4班', '陳帥', 78);
2.通用寫法,不分數據庫:
select class, name, score
from test_score a
where (select count(*) from test_score where class = a.class and a.score < score) < 3
order by a.class, a.score desc;
3.Oracle,DB2利用開口函數,
select class, name, score
from (select class, score, name,
rank() over (partition by class order by score desc ) as rownum
from test_score)
where rownum < 4;
4.MySQL利用變量實現,
set @pre_class:=null, @rownum:=0;
select
class, name, score
from
(SELECT class, score, name,
# @rownum:=if(@pre_class=class,@rownum+1,1) count,
@rownum:= (case when @pre_class = class then @rownum + 1 else 1 end) count,
@pre_class:=class
FROM test_score
order by class asc, score desc ) T
where count < 4;
5.查詢結果如下,