SQL Server 之 與 OVER() 函數


  在SQL SERVER 2005/2008支持兩種排名開窗函數和聚集開窗函數。

一、 OVER() 函數

  語法結構:OVER( [ PARTITION BY ... ] [ ORDER BY ... ] )

  [1] PARTITION BY 子句進行分組;

  [2] PARTITION BY 子句進行排序。

  窗口函數OVER()指定一組行,開窗函數計算從窗口函數輸出的結果集中各行的值。

  開窗函數不需要使用GROUP BY就可以對數據進行分組,還可以同時返回基礎行的列和聚合列。

  OVER()函數不能單獨使用,必須跟在 排名函數 或 聚合函數后邊。

二、排名開窗函數

  ROW_NUMBER()、DENSE_RANK()、RANK()、NTILE()屬於排名函數。

  排名開窗函數可以單獨使用ORDER BY 語句,也可以和PARTITION BY同時使用。

  PARTITION BY用於將結果集進行分組,開窗函數應用於每一組。

  ODER BY 指定排名開窗函數的順序。

  注意:在排名開窗函數中必須使用ORDER BY語句。

  語法結構:排名函數 ( ) OVER ( [ <partition_by子句> ] <order_by子句> ) 

  1、ROW_NUMBER():為每一組的行記錄按順序生成一個唯一的行號。

  2、RANK()也為每一組的行生成一個序號,與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會生成相同的序號,並且接下來的序號是不連序的。例如兩個相同的行生成序號3,那么接下來會生成序號5。

  3、DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那么接下來的序號不會間斷。也就是說如果兩個相同的行生成序號3,那么接下來生成的序號還是4。

  4、NTILE (integer_expression) 按照指定的數目將數據進行分組,並為每一組生成一個序號。

三、聚合開窗函數

  很多聚合函數都可以用作窗口函數的運算,如COUNT(),SUM(),AVG(),MAX(MIN()。

  聚合開窗函數只能使用PARTITION BY子句或都不帶任何語句,ORDER BY不能與聚合開窗函數一同使用。

  如果窗口函數不使用PARTITION BY 語句的話,那么就是不對數據進行分組,聚合函數計算所有的行的值。

  語法結構:聚合函數( ) OVER ( [ <partition_by子句> ] ) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM