1. 程式人生 > 其它 >給倆個有序陣列(從小到大),判斷兩者中全部元素的中位數

給倆個有序陣列(從小到大),判斷兩者中全部元素的中位數

1.ROW_NUMBER() 函式

依次排序,沒有並列名次。如

SELECT st.ID '學號', st.`NAME` '姓名', sc.SCORE '成績', ROW_NUMBER() OVER(ORDER BY sc.SCORE DESC) '排名'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查詢結果為

可以看出,儘管存在相同的成績(98.0、91.0),但是排名並沒有並列,而是按順序依次排號。

2.RANK() 函式

有並列名次,且並列名次會佔用序號,因此名次之間可能會有間隔。如

SELECT st.ID '
學號', st.`NAME` '姓名', sc.SCORE '成績', RANK() OVER(ORDER BY sc.SCORE DESC) '排名' FROM Student st LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查詢結果為

可以看出,相同的成績(98.0、91.0)的排名是相同的(並列第2名、並列第5名),且並列的名次會佔用序號,因此與它下一個名次之間會有間隔。

顯然這種結果是最符合實際生活中的排名的。

3.DENSE_RANK() 函式

有並列名次,但並列名次不佔用序號,因此名次都是緊密相連的。如

SELECT st.ID '
學號', st.`NAME` '姓名', sc.SCORE '成績', DENSE_RANK() OVER(ORDER BY sc.SCORE DESC) '排名' FROM Student st LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查詢結果為

可以看出,相同的成績(98.0、91.0)的排名是相同的(並列第2名、並列第5名),但並列的名次並會佔用序號,因此與它下一個名次之間沒有間隔,所有名次都是緊密相連的。

4.NTILE() 函式

NTILE(n) 函式可以將返回的結果排序,如

SELECT st.ID '學號', st.`NAME` '
姓名', sc.SCORE '成績', NTILE(4) OVER(ORDER BY sc.SCORE DESC) '組號' FROM Student st LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

表示將成績按從大到小排序後,把結果分為4組。由於總記錄數為8條,因此每組會有2條記錄:

這樣每組的記錄數是均勻的。

但如果查詢結果的總記錄數不能被指定的要分的組的總數整數,則分得的每組中的記錄數是不均勻的,如

SELECT st.ID '學號', st.`NAME` '姓名', sc.SCORE '成績', NTILE(3) OVER(ORDER BY sc.SCORE DESC) '組號'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

由於 8 不能被 3 整除,因此得到的 3 組中每組的記錄數不是完全一樣的,而是按照 3、3、2 分配的,即"儘量"保證了均勻。