OVER() 子句將彙總函數(SUM、AVG、COUNT 等)轉為分析函數,不再縮減行數,而是為每一行計算基於「視窗」的彙總值。
聚合函數(...) OVER (
[PARTITION BY 分組欄位]
[ORDER BY 排序欄位]
[ROWS/RANGE BETWEEN ...] -- 視窗框架,進階用法
)
14 筆員工資料,含 deptno、ename、sal。
SELECT deptno, ename, sal,
SUM(sal) OVER (ORDER BY ename) AS running_total,
SUM(sal) OVER () AS grand_total,
ROUND(100 * sal / SUM(sal) OVER (), 2) AS pct_of_total
FROM emp;
關鍵差異:
OVER (ORDER BY ename):依名稱排序後逐行累加(Running Total)。OVER ():無排序、無分組,等同全表總和(每行相同值)。SELECT deptno, ename, sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY ename) AS dept_running,
SUM(sal) OVER (PARTITION BY deptno) AS dept_total,
ROUND(100 * sal / SUM(sal) OVER (PARTITION BY deptno), 2) AS dept_pct,
SUM(sal) OVER (ORDER BY deptno, ename) AS global_running,
SUM(sal) OVER () AS grand_total,
ROUND(100 * sal / SUM(sal) OVER (), 2) AS grand_pct
FROM emp;
| deptno | ename | sal | dept_running | dept_total | dept_pct | global_running | grand_total | grand_pct |
|---|---|---|---|---|---|---|---|---|
| 10 | CLARK | 2450 | 2450 | 8750 | 28.00 | 2450 | 29025 | 8.44 |
| 10 | KING | 5000 | 7450 | 8750 | 57.14 | 7450 | 29025 | 17.23 |
| 10 | MILLER | 1300 | 8750 | 8750 | 14.86 | 8750 | 29025 | 4.48 |
| 20 | ADAMS | 1100 | 1100 | 10875 | 10.11 | 9850 | 29025 | 3.79 |
| 20 | FORD | 3000 | 4100 | 10875 | 27.59 | 12850 | 29025 | 10.34 |
| 20 | JONES | 2975 | 7075 | 10875 | 27.36 | 15825 | 29025 | 10.25 |
| 20 | SCOTT | 3000 | 10075 | 10875 | 27.59 | 18825 | 29025 | 10.34 |
| 20 | SMITH | 800 | 10875 | 10875 | 7.36 | 19625 | 29025 | 2.76 |
| 30 | ALLEN | 1600 | 1600 | 9400 | 17.02 | 21225 | 29025 | 5.51 |
| 30 | BLAKE | 2850 | 4450 | 9400 | 30.32 | 24075 | 29025 | 9.82 |
| 30 | JAMES | 950 | 5400 | 9400 | 10.11 | 25025 | 29025 | 3.27 |
| 30 | MARTIN | 1250 | 6650 | 9400 | 13.30 | 26275 | 29025 | 4.31 |
| 30 | TURNER | 1500 | 8150 | 9400 | 15.96 | 27775 | 29025 | 5.17 |
| 30 | WARD | 1250 | 9400 | 9400 | 13.30 | 29025 | 29025 | 4.31 |
SUM(amt) OVER (PARTITION BY shop_id ORDER BY sale_date)ROW_NUMBER() OVER (PARTITION BY dept ORDER BY sal DESC) 取各部門前 3 高薪。LAG(sal) OVER (PARTITION BY empno ORDER BY month) 取上月薪資。AVG(sal) OVER (ORDER BY ename ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)PARTITION BY 欄位若有索引可避免排序開銷。RANGE 搭配數值/日期型別,可能觸發昂貴的排序操作;優先用 ROWS。