日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql 包含_SQL笔记:在一张包含学生ID、课程、成绩的表中,检索各科前三名

發布時間:2024/9/18 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql 包含_SQL笔记:在一张包含学生ID、课程、成绩的表中,检索各科前三名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

表定義 及 測試數據

CREATE TABLE `score_info` ( `student_id` int NOT NULL AUTO_INCREMENT, `category` varchar(255) DEFAULT NULL, `score` int DEFAULT NULL, PRIMARY KEY (`student_id`)) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT INTO `score_info` VALUES ('1', '語', '99');INSERT INTO `score_info` VALUES ('2', '數', '32');INSERT INTO `score_info` VALUES ('3', '外', '88');INSERT INTO `score_info` VALUES ('4', '語', '89');INSERT INTO `score_info` VALUES ('5', '數', '57');INSERT INTO `score_info` VALUES ('6', '外', '67');INSERT INTO `score_info` VALUES ('7', '語', '72');INSERT INTO `score_info` VALUES ('8', '數', '48');INSERT INTO `score_info` VALUES ('9', '外', '53');INSERT INTO `score_info` VALUES ('10', '語', '96');INSERT INTO `score_info` VALUES ('11', '數', '69');INSERT INTO `score_info` VALUES ('12', '數', '39');INSERT INTO `score_info` VALUES ('13', '外', '93');INSERT INTO `score_info` VALUES ('14', '數', '39');INSERT INTO `score_info` VALUES ('15', '外', '93');INSERT INTO `score_info` VALUES ('16', '語', '96');INSERT INTO `score_info` VALUES ('17', '數', '39');INSERT INTO `score_info` VALUES ('18', '語', '96');INSERT INTO `score_info` VALUES ('19', '數', '88');INSERT INTO `score_info` VALUES ('20', '語', '77');INSERT INTO `score_info` VALUES ('21', '數', '54');INSERT INTO `score_info` VALUES ('22', '外', '73');INSERT INTO `score_info` VALUES ('23', '數', '96');

查詢結果

  • 根據分數排名(分數相同 按先后排序)
SELECTt.student_id,t.category,t.score,t.rowNumberFROM(SELECTs.*,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3
  • 根據分數排民(分數相同并列)
SELECTt.category,t.score,t.studentIds,t.rowNumberFROM(SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3

思路

要在一張包含學生ID、成績、課程的表中檢索出每門課程的前三名

1)、分組課程,再按成績排序

SELECTs.*,@rowNumber :=@rowNumber + 1 rowNumberFROMscore_info s,(SELECT @rowNumber := 0) rORDER BYcategory DESC,score DESC;

2)、要根據不同的課程各自排序,要先獲取到“上一條數據”的課程類型

SELECTs.*,@rowNumber :=@rowNumber + 1 rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC;

3)、已經獲取到上一條數據的課程類型,那就可以用當前課程比對上一條課程,判斷是否重新排序

SELECTs.*,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC;

4)、分組課程和成績,實現 課程相同 且 成績相同的排名并列(根據需求 自行決定是否需要并列)

SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC

5)、已經可以獲取到各科成績排名,要獲取前三名 可以直接where rowNumber<=3 ,即可實現檢索各科前三名

SELECTt.category,t.score,t.studentIds,t.rowNumberFROM(SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3

總結

以上是生活随笔為你收集整理的sql 包含_SQL笔记:在一张包含学生ID、课程、成绩的表中,检索各科前三名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。