最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL分類排名和分組TOP N實(shí)例詳解

 更新時間:2022年01月11日 14:17:07   作者:奔放的程序猿  
大家好,本篇文章主要講的是MySQL分類排名和分組TOP N實(shí)例詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

表結(jié)構(gòu)

學(xué)生表如下:

CREATE TABLE `t_student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `t_id` int DEFAULT NULL COMMENT '學(xué)科id',
  `score` int DEFAULT NULL COMMENT '分?jǐn)?shù)',
  PRIMARY KEY (`id`)
);

數(shù)據(jù)如下: 

題目一:獲取每個科目下前五成績排名(允許并列)

允許并列情況可能存在如4、5名成績并列情況,會導(dǎo)致取前4名得出5條數(shù)據(jù),取前5名也是5條數(shù)據(jù)。

SELECT
	s1.* 
FROM
	student s1
	LEFT JOIN student s2 ON s1.t_id = s2.t_id 
	AND s1.score < s2.score 
GROUP BY
	s1.id
HAVING
	COUNT( s2.id ) < 5 
ORDER BY
	s1.t_id,
	s1.score DESC

  ps:取前4名時

 分析:

1.自身左外連接,得到所有的左邊值小于右邊值的集合。以t_id=1時舉例,24有5個成績大于他的(74、64、54、44、34),是第6名,34只有4個成績大于他的,是第5名......74沒有大于他的,是第一名。

SELECT
	* 
FROM
	student s1
	LEFT JOIN student s2 ON s1.t_id = s2.t_id 
	AND s1.score < s2.score 

  2. 把總結(jié)的規(guī)律轉(zhuǎn)換成SQL表示出來,就是group by 每個student 的 id(s1.id),Having統(tǒng)計(jì)這個id下面有多少個比他大的值(s2.id)

SELECT
	s1.* 
FROM
	student s1
	LEFT JOIN student s2 ON s1.t_id = s2.t_id 
	AND s1.score < s2.score 
GROUP BY
	s1.id
HAVING
	COUNT( s2.id ) < 5 

 3. 最后根據(jù) t_id 分類,score 倒序排序即可。

題目二:獲取每個科目下最后兩名學(xué)生的成績平均值

取最后兩名成績

SELECT
	s1.* 
FROM
	student s1
	LEFT JOIN student s2 ON s1.t_id = s2.t_id 
	AND s1.score > s2.score 
GROUP BY
	s1.id 
HAVING
	COUNT( s1.id )< 2 
ORDER BY
	s1.t_id,
	s1.score

并列存在情況下可能導(dǎo)致篩選出的同一t_id 下結(jié)果條數(shù)大于2條,但題目要求是取最后兩名的平均值,多條平均后還是本身,故不必再對其處理,可以滿足題目要求。 

 分組求平均值:

SELECT
	t_id,AVG(score)
FROM
	(
	SELECT
		s1.*
	FROM
		student s1
		LEFT JOIN student s2 ON s1.t_id = s2.t_id 
		AND s1.score > s2.score
	GROUP BY
		s1.id 
	HAVING
		COUNT( s1.id )< 2 
	ORDER BY
		s1.t_id,
		s1.score 
	) tt 
GROUP BY
	t_id

結(jié)果: 

分析:

1. 查詢出所有t1.score>t2.score 的記錄

SELECT
		s1.*,s2.*
	FROM
		student s1
		LEFT JOIN student s2 ON s1.t_id = s2.t_id 
		AND s1.score > s2.score

2. group by s.id 去重,having 計(jì)數(shù)取2條

3. group by t_id 分別取各自學(xué)科的然后avg取均值

題目三:獲取每個科目下前五成績排名(不允許并列)

SELECT
	* 
FROM
	(
	SELECT
		s1.*,
		@rownum := @rownum + 1 AS num_tmp,
		@incrnum :=
	CASE
			
			WHEN @rowtotal = s1.score THEN
			@incrnum 
			WHEN @rowtotal := s1.score THEN
			@rownum 
		END AS rownum 
	FROM
		student s1
		LEFT JOIN student s2 ON s1.t_id = s2.t_id 
		AND s1.score > s2.score,
		( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it 
	GROUP BY
		s1.id 
	ORDER BY
		s1.t_id,
		s1.score DESC 
	) tt 
GROUP BY
	t_id,
	score,
	rownum 
HAVING
	COUNT( rownum )< 5

 分析:

1.引入輔助參數(shù)

SELECT
	s1.*,
	@rownum := @rownum + 1 AS num_tmp,
	@incrnum :=
CASE
		
		WHEN @rowtotal = s1.score THEN
		@incrnum 
		WHEN @rowtotal := s1.score THEN
		@rownum 
	END AS rownum 
FROM
	student s1
	LEFT JOIN student s2 ON s1.t_id = s2.t_id 
	AND s1.score > s2.score,
	( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it

2.去除重復(fù)s1.id,分組排序

SELECT
		s1.*,
		@rownum := @rownum + 1 AS num_tmp,
		@incrnum :=
	CASE
			
			WHEN @rowtotal = s1.score THEN
			@incrnum 
			WHEN @rowtotal := s1.score THEN
			@rownum 
		END AS rownum 
	FROM
		student s1
		LEFT JOIN student s2 ON s1.t_id = s2.t_id 
		AND s1.score > s2.score,
		( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) AS it 
	GROUP BY
		s1.id 
	ORDER BY
		s1.t_id,
		s1.score DESC 

 3.GROUP BY    t_id, score, rownum   然后 HAVING 取前5條不重復(fù)的

總結(jié)

到此這篇關(guān)于MySQL分類排名和分組TOP N實(shí)例詳解的文章就介紹到這了,更多相關(guān)MySQL分類排名 TOP N內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL自5.7版本起,對JSON數(shù)據(jù)類型提供了全面的支持,本文主要介紹了MySQL中查詢JSON字段的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • mysql中查詢字段為null的數(shù)據(jù)navicat問題

    mysql中查詢字段為null的數(shù)據(jù)navicat問題

    這篇文章主要介紹了mysql中查詢字段為null的數(shù)據(jù)navicat問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • mysql binlog(二進(jìn)制日志)查看方法

    mysql binlog(二進(jìn)制日志)查看方法

    在本篇文章里小編給大家分享了關(guān)于mysql binlog(二進(jìn)制日志)查看方法,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • mysql篩選GROUP BY多個字段組合時的用法分享

    mysql篩選GROUP BY多個字段組合時的用法分享

    mysql篩選GROUP BY多個字段組合時的用法分享,需要的朋友可以參考下。
    2011-04-04
  • 詳細(xì)講述MySQL中的子查詢操作

    詳細(xì)講述MySQL中的子查詢操作

    這篇文章主要介紹了詳細(xì)講述MySQL中的子查詢操作,文中也給出了具體的代碼實(shí)例講解,需要的朋友可以參考下
    2015-04-04
  • MySQL系列教程小白數(shù)據(jù)庫基礎(chǔ)

    MySQL系列教程小白數(shù)據(jù)庫基礎(chǔ)

    這篇文章主要為大家介紹了MySQL系列中的數(shù)據(jù)庫基礎(chǔ),非常適合數(shù)據(jù)庫小白的入門基礎(chǔ)篇,詳細(xì)的講解了數(shù)據(jù)庫的基本概念以及基礎(chǔ)命令及操作示例,有需要的朋友可以借鑒參考下
    2021-10-10
  • MySQL內(nèi)部函數(shù)的超詳細(xì)介紹

    MySQL內(nèi)部函數(shù)的超詳細(xì)介紹

    眾所周知MySQL有很多內(nèi)置的函數(shù),下面這篇文章主要給大家介紹了關(guān)于MySQL內(nèi)部函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-08-08
  • mysql 5.7.21解壓版安裝配置方法圖文教程(win10)

    mysql 5.7.21解壓版安裝配置方法圖文教程(win10)

    這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.21解壓版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 想取消錯誤的mysql命令怎么辦?

    想取消錯誤的mysql命令怎么辦?

    今天小編就為大家分享一篇關(guān)于想取消錯誤的mysql命令怎么辦?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • MySQL查詢和篩選存儲的JSON數(shù)據(jù)的操作方法

    MySQL查詢和篩選存儲的JSON數(shù)據(jù)的操作方法

    MySQL是常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),為了支持非結(jié)構(gòu)化數(shù)據(jù)的存儲和查詢,MySQL引入了對JSON數(shù)據(jù)類型的支持,JSON是一種輕量級的數(shù)據(jù)交換格式,在現(xiàn)代應(yīng)用程序中得到了廣泛應(yīng)用,處理和存儲非結(jié)構(gòu)化數(shù)據(jù)變得越來越重要,本文給大家介紹mysql查詢JSON數(shù)據(jù)的相關(guān)知識,一起看看吧
    2024-01-01

最新評論

金昌市| 偃师市| 宜兴市| 全州县| 法库县| 中江县| 澄城县| 绥棱县| 上饶县| 金堂县| 思茅市| 邢台市| 河间市| 辽宁省| 黎城县| 临猗县| 和顺县| 日喀则市| 鄂托克旗| 永嘉县| 嘉善县| 皮山县| 申扎县| 福泉市| 宁乡县| 郯城县| 北安市| 固安县| 台前县| 浙江省| 汽车| 麻江县| 阳西县| 新泰市| 介休市| 大悟县| 库伦旗| 醴陵市| 博乐市| 北碚区| 涞水县|