開窗函式:
它可以理解為記錄集合,開窗函式也就是在滿足某種條件的記錄集合上執行的特殊函式。
對於每條記錄都要在此視窗內執行函式,有的函式隨著記錄不同,視窗大小都是固定的,這種屬於靜態視窗;
有的函式則相反,不同的記錄對應著不同的視窗,這種動態變化的視窗叫滑動視窗。
開窗函式的本質還是聚合運算,只不過它更具靈活性,它對資料的每一行,都使用與該行相關的行進行計算並返回計算結果。
開窗函式和普通聚合函式的區別聚合函式是將多條記錄聚合為一條;而開窗函式是每條記錄都會執行,有幾條記錄執行完還是幾條。
聚合函式也可以用於開窗函式中。
按照函式功能不同,mysql支援的開窗函式分為如下幾類:
序號函式:row_number() / rank() / dense_rank()
分布函式:percent_rank() / cume_dist()
前後函式:lag() / lead()
頭尾函式:first_value() / last_value()
其他函式:nth_value() / nfile()
開窗函式的乙個概念是當前行,當前行屬於某個視窗,視窗由
over關鍵字用來指定函式執行的視窗範圍,如果後面括號中什麼都不寫,則意味著視窗包含滿足where條件的所有行,開窗函式基於所有行進行計算;如果不為空,則有三個引數來設定視窗:
partition by子句:按照指定字段進行分割槽,兩個分割槽由邊界分隔,開窗函式在不同的分區內分別執行,在跨越分割槽邊界時重新初始化。
order by子句:按照指定字段進行排序,開窗函式將按照排序後的記錄順序進行編號。可以和partition by子句配合使用,也可以單獨使用。
frame子句:當前分割槽的乙個子集,用來定義子集的規則,通常用來作為滑動視窗使用。
current row 邊界是當前行,一般和其他範圍關鍵字一起使用
unbounded preceding 邊界是分割槽中的第一行
unbounded following 邊界是分割槽中的最後一行
expr preceding 邊界是當前行減去expr的值
expr following 邊界是當前行加上expr的值
rows between 1 preceding and 1 following 視窗範圍是分割槽中的當前行、前一行、後一行一共三行記錄。
rows between 1 preceding and current row 視窗範圍是分割槽中的前一行、當前行一共兩行記錄。
rows between current row and 1 following 視窗範圍是分割槽中的當前行、後一行一共兩行記錄。
rows unbounded preceding 視窗範圍是分割槽中的第一行到當前行。
rows between unbounded preceding and current row 視窗範圍是分割槽中的第一行到當前行。
rows between current row and unbounded following 視窗範圍是分割槽中的當前行到最後一行。
rows between unbounded preceding and unbounded following 視窗範圍是當前分割槽中所有行,等同於不寫。
mysql 開窗函式 累加 mysql實現開窗函式
學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount 201601 1 50...
mysql實現開窗函式
mysql實現開窗函式 學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount...
mysql 索引有哪些 mysql索引有哪些型別
mysql目前主要有的索引型別為 普通索引 唯一索引 主鍵索引 組合索引 全文索引。下面本篇文章就來給大家介紹一下這些mysql索引,希望對你們有所幫助。通過給字段新增索引可以提高資料的讀取速度,提高專案的併發能力和抗壓能力。索引優化時mysql中的一種優化方式。索引的作用相當於圖書的目錄,可以根據...