sql查詢每個班級的前三名

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.查詢結果如下,

參考:MYSQL:巧用臨時變量做分組統計

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章