1. 程式人生 > 資料庫 >Mysql8.0使用視窗函式解決排序問題

Mysql8.0使用視窗函式解決排序問題

MySQL視窗函式簡介

MySQL從8.0開始支援視窗函式,這個功能在大多商業資料庫和部分開源資料庫中早已支援,有的也叫分析函式。

什麼叫視窗?

視窗的概念非常重要,它可以理解為記錄集合,視窗函式也就是在滿足某種條件的記錄集合上執行的特殊函式。對於每條記錄都要在此視窗內執行函式,有的函式隨著記錄不同,視窗大小都是固定的,這種屬於靜態視窗;有的函式則相反,不同的記錄對應著不同的視窗,這種動態變化的視窗叫滑動視窗。

視窗函式和普通聚合函式也很容易混淆,二者區別如下:

聚合函式是將多條記錄聚合為一條;而視窗函式是每條記錄都會執行,有幾條記錄執行完還是幾條。

聚合函式也可以用於視窗函式中,這個後面會舉例說明。

一、mysql5.0

例如:我們要計算銷售人員的銷售額,結果按從高到低排序,查詢結果中要包含銷售的排名。


這是擷取某商品訂單表的一部分資料

1、計算銷售人員的銷售額,結果按從高到低排序

這一部分我們可以直接使用group by對銷售人員分組,使用聚合函式sum對銷售額進行求和,結果對銷售額使用order by 排序就可以。語句如下:

SELECT sales_name,sum( profit ) FROM spm_order GROUP BY sales_name ORDER BY sum( profit ) DESC


查詢結果

2、如果查詢結果要包含銷售的排名。

在mysql5.0中, 我們要定義一個排序自增的變數,讓它實現自動+1來作為一個新的列。語句如下:

SET @rank = 0;
SELECT
A.*,@rank := @rank + 1 AS rank_no
FROM
( SELECT sales_name,sum( profit ) FROM spm_order GROUP BY sales_name ORDER BY sum( profit ) DESC ) A

這裡的:=就是賦值的意思 這裡的A就是把子查詢取一個別名方便前面呼叫。

結果如下:


在這裡插入圖片描述

二、mysql8.0

對於這個問題,在mysql8.0中有專門的的視窗函式可以呼叫,複雜問題簡單化。

語句如下:

SELECT
sales_name,sum( sales ),row_number ( ) over ( ORDER BY sum( sales ) DESC ) AS ‘rank'
FROM
spm_order
GROUP BY
sales_name

結果:


在這裡插入圖片描述

在這裡我們使用了[ row_number() over () ] ,在over()裡面直接寫上我們要排序的內容。
工作中企業基本都是用的5.0版本,所以多學習一下吧。

總結

以上所述是小編給大家介紹的Mysql8.0使用視窗函式解決排序問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!