1. 程式人生 > >sql語句關鍵字over的作用及用法

sql語句關鍵字over的作用及用法

在應用具體的聚合函式、排名函式前對行集的分割槽和排序。over子句,用於支援視窗的計算,所以一般與排名開窗函式、聚合開窗函式一起使用。
  視窗是使用者指定的一組行。開窗函式計算從視窗派生的結果集中各行的值。 以前使用聚合函式必須分組,即便沒有group by 子句,也是預設將表中所有的資料分成了1組,來聚合。通過使用over子句可以在不分組的情況下實現聚合運算,在查詢結果集中既包含基礎行的資料也包含聚合函式的值。(可以把over()子句理解成是“後臺執行的資料”,只是為了讓聚合函式或者是排名函式“用一下”,並不影響實際顯示的資料。在後臺提供資料。) 
over子句的兩種使用方式:  1.over子句與排名開窗函式一起用,語法:over([partition by 列1] order by 列2)。必須有order by 子句  2.over子句與聚合開窗函式一起用,語法:over([partition by 列1])不能使用order by子句了。【先演示這個】  注:當over()子句與聚合函式一起使用時,也可以直接寫count(*) over()不在over()子句中進行任何分割槽,表示把整個表分為一個區。  第1種使用方式  over不能單獨使用,要和分析函式:rank(),dense_rank(),row_number()等一起使用。 其引數:over(partition by columnname1 order by columnname2)  含義:按columname1指定的欄位的值,對查詢後的結果集進行分組再組內排序,形成結果集中的一個新列。若SQL語句最後有order by,則把最終的結果集再整體排序。   例如:employees表中,有兩個部門的記錄:department_id =10和20  SQL語句“select department_id ,salary,rank() over(partition
 by department_id order by salary ) from Employees ”,就是指在部門10中進行薪水的排名,在部門20中進行薪水排名。如果是沒有partition by部分,則是在整個公司內進行排名。


第2種使用方式  下面的示例對於查詢返回的所有行,將 OVER 子句與聚合函式一起使用。 
在這個示例中,使用 OVER 子句與使用子查詢相比,可以更高效地派生聚合值。  

USE AdventureWorks2012;  
GO  
SELECT SalesOrderID, ProductID, OrderQty      ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total     ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg"      ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count"     ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min"     ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max" FROM Sales.SalesOrderDetail   WHERE SalesOrderID IN(43659,43664); 
GO