1、MySQL8.0以上版本 用法1:無分組排序 Row_number() OVER(ORDER BY 欄位 DESC)例如:Row_number() OVER(ORDER BY 學生成績 DESC)表示不分班級,所有學生的成績從高到低排序用法2:分組排序ROW_NUMBER() OVER(PART ...
1、MySQL8.0以上版本
用法1:無分組排序
Row_number() OVER(ORDER BY 欄位 DESC)
例如:Row_number() OVER(ORDER BY 學生成績 DESC)
表示不分班級,所有學生的成績從高到低排序
用法2:分組排序
ROW_NUMBER() OVER(PARTITION BY 欄位1 ORDER BY 欄位2 DESC)
表示根據欄位1分組,在分組內部根據欄位2排序,這個函數計算的值就表示每組內部排序後的順序編號
例如:ROW_NUMBER() OVER(PARTITION BY 班級 ORDER BY 學生成績 DESC)
表示根據“班級”分組,在每個“班級”內部根據“學生成績”排序,這個函數計算的值就表示每組內部排序後的
順序編號
解釋:
ROW_NUMBER( ) 起到了編號的功能
partition by 將相同數據進行分區
order by 使得數據按一定順序排序
2、MySQL5.7版本
用法1:無分組排序
例如:計算銷售人員的銷售額,結果按從高到低排序,查詢結果中要包含銷售的排名
SET @rank := 0;
SELECT
A.*,
@rank := @rank + 1 AS rank
FROM
( SELECT sales_name, sum( sales ) FROM spm_order
GROUP BY sales_name
ORDER BY sum( sales ) DESC ) A
用法2:分組排序
例:計算銷售人員在不同城市的銷售額;
要求:結果根據銷售人員在不同城市的銷售額進行分組排序(降序),並且查詢結果要包含分組排名
SET @r := 0,
@type := '';
SELECT
@r :=
CASE WHEN @type = a.sales_name THEN
@r + 1 ELSE 1
END AS rowNum,
@type := a.sales_name AS type,
a.*
FROM
( SELECT sales_name, city, sum( sales ) FROM spm_order
GROUP BY sales_name, city
ORDER BY sales_name, sum( sales ) DESC ) a;