函數() OVER (
[PARTITION BY 分區列]
[ORDER BY 排序列]
[ROWS/RANGE BETWEEN 幀範圍]
)
| 族群 | 函數 | 典型用途 |
|---|---|---|
| 聚合 | SUM/COUNT/MIN/MAX/AVG | 運行總計、移動平均、分組佔比 |
| 排名 | ROW_NUMBER/RANK/DENSE_RANK/NTILE | 分組 Top-N、去重、分頁、分桶 |
| 分布 | PERCENT_RANK/CUME_DIST/PERCENTILE_CONT/DISC | 百分位、中位數、累積分布 |
| 偏移 | LAG/LEAD/FIRST_VALUE/LAST_VALUE | 同比環比、缺口檢測、首尾值 |
SELECT
orderid, orderdate, val,
RANK() OVER (ORDER BY val DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY val DESC) AS drnk,
ROW_NUMBER() OVER (ORDER BY val DESC) AS rn
FROM Sales.OrderValues
ORDER BY rnk;
結果:並列金額 RANK 跳號 (1,2,2,4),DENSE_RANK 不跳 (1,2,2,3),ROW_NUMBER 唯一遞增。
SELECT
orderid, val,
SUM(val) OVER (ORDER BY orderid
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
FROM Sales.OrderValues;
SELECT
orderdate, val,
AVG(val) OVER (ORDER BY orderdate
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS MA7
FROM Sales.OrderValues;
WITH Ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Sales DESC) AS rn
FROM ProductSales
)
SELECT * FROM Ranked WHERE rn <= 3;
-- 島嶼識別:連續日期分組
SELECT *,
DATEADD(DAY, -ROW_NUMBER() OVER (ORDER BY Date), Date) AS Grp
FROM Calendar
WHERE IsWorkingDay = 1;
-- 相同 Grp 即同一島嶼
SELECT
Month, Sales,
LAG(Sales, 1) OVER (ORDER BY Month) AS PrevMonth,
Sales - LAG(Sales, 1) OVER (ORDER BY Month) AS MoM_Change
FROM MonthlySales;
PARTITION BY 列建議有索引支援ORDER BY 列與索引順序一致可避免 Sort 運算子