本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SUM 視窗函數
SUM 視窗函數會傳回輸入資料欄或表達式值的總和。SUM 函數使用數值並忽略NULL值。
語法
SUM ( [ ALL ] expression ) OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list frame_clause ] )
引數
- expression
-
函數運算的目標欄或表達式。
- ALL
-
使用引數 ALL,函數會保留運算式中的所有重複值。ALL 為預設值。不支援 DISTINCT。
- OVER
-
指定彙總函數的視窗子句。OVER 子句會將視窗彙總函數與一般設定彙總函數區分開來。
- PARTITION 依 expr_list 排序
-
以一或多個表達式定義SUM函數的視窗。
- ORDER BY 訂單_清單
-
排序每一個分割區內的列。如果未指定 PARTITION BY,ORDERBY 會使用整個資料表。
- frame_clause
-
如果 ORDER BY 子句用於彙總函數,則需要明確的影格子句。窗框子句在排序的結果內包含或排除列集,以調整函數視窗中的一個列集。框架子句由ROWS關鍵字和相關聯的規格符組成。請參閱 範圍函數語法摘要。
資料類型
SUM 函數支援的引數類型為 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、 REAL和 DOUBLE PRECISION。
SUM 函數支援的傳回類型為:
-
BIGINT 適用於 SMALLINT或 INTEGER引數
-
NUMERIC 適用於BIGINT引數
-
DOUBLE PRECISION 適用於浮點引數
範例
下列範例會建立銷售數量的累積 (滾動) 總和,依日期和銷售 ID 排序:
select salesid, dateid, sellerid, qty, sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum from winsales order by 2,1; salesid | dateid | sellerid | qty | sum ---------+------------+----------+-----+----- 30001 | 2003-08-02 | 3 | 10 | 10 10001 | 2003-12-24 | 1 | 10 | 20 10005 | 2003-12-24 | 1 | 30 | 50 40001 | 2004-01-09 | 4 | 40 | 90 10006 | 2004-01-18 | 1 | 10 | 100 20001 | 2004-02-12 | 2 | 20 | 120 40005 | 2004-02-12 | 4 | 10 | 130 20002 | 2004-02-16 | 2 | 20 | 150 30003 | 2004-04-18 | 3 | 15 | 165 30004 | 2004-04-18 | 3 | 20 | 185 30007 | 2004-09-07 | 3 | 30 | 215 (11 rows)
如需WINSALES資料表的說明,請參閱 範圍函數範例的範例資料表。
以下範例會依日期建立銷售數量的累積 (滾動) 總和、依賣方 ID 分割結果,然後在分割區內依日期和銷售 ID 排序結果:
select salesid, dateid, sellerid, qty, sum(qty) over (partition by sellerid order by dateid, salesid rows unbounded preceding) as sum from winsales order by 2,1; salesid | dateid | sellerid | qty | sum ---------+------------+----------+-----+----- 30001 | 2003-08-02 | 3 | 10 | 10 10001 | 2003-12-24 | 1 | 10 | 10 10005 | 2003-12-24 | 1 | 30 | 40 40001 | 2004-01-09 | 4 | 40 | 40 10006 | 2004-01-18 | 1 | 10 | 50 20001 | 2004-02-12 | 2 | 20 | 20 40005 | 2004-02-12 | 4 | 10 | 50 20002 | 2004-02-16 | 2 | 20 | 40 30003 | 2004-04-18 | 3 | 15 | 25 30004 | 2004-04-18 | 3 | 20 | 45 30007 | 2004-09-07 | 3 | 30 | 75 (11 rows)
下列範例會依 SELLERID和 SALESID資料欄順序,依序編號結果集中的所有資料列:
select salesid, sellerid, qty, sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum from winsales order by 2,1; salesid | sellerid | qty | rownum --------+----------+------+-------- 10001 | 1 | 10 | 1 10005 | 1 | 30 | 2 10006 | 1 | 10 | 3 20001 | 2 | 20 | 4 20002 | 2 | 20 | 5 30001 | 3 | 10 | 6 30003 | 3 | 15 | 7 30004 | 3 | 20 | 8 30007 | 3 | 30 | 9 40001 | 4 | 40 | 10 40005 | 4 | 10 | 11 (11 rows)
如需WINSALES資料表的說明,請參閱 範圍函數範例的範例資料表。
下列範例會依序編號結果集中的所有資料列、依 分割結果SELLERID,並依 SELLERID和 SALESID 排序結果:
select salesid, sellerid, qty, sum(1) over (partition by sellerid order by sellerid, salesid rows unbounded preceding) as rownum from winsales order by 2,1; salesid | sellerid | qty | rownum ---------+----------+-----+-------- 10001 | 1 | 10 | 1 10005 | 1 | 30 | 2 10006 | 1 | 10 | 3 20001 | 2 | 20 | 1 20002 | 2 | 20 | 2 30001 | 3 | 10 | 1 30003 | 3 | 15 | 2 30004 | 3 | 20 | 3 30007 | 3 | 30 | 4 40001 | 4 | 40 | 1 40005 | 4 | 10 | 2 (11 rows)