CREATE TABLE User_Salary (
UserName NVARCHAR(200),
Month NVARCHAR(20), -- 格式 'YYYY/MM'
Salary INT
);
同一 UserName 依 Month 降序,計算「截至當月(含)的薪資累計」。
SELECT u.*,
(SELECT SUM(salary)
FROM User_Salary
WHERE UserName = u.UserName
AND Month <= u.Month) AS 總和
FROM User_Salary u
ORDER BY u.UserName, u.Month DESC;
SELECT UserName, Month, Salary,
SUM(Salary) OVER (PARTITION BY UserName ORDER BY Month DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 總和
FROM User_Salary
ORDER BY UserName, Month DESC;
PARTITION BY UserName 分組,ORDER BY Month DESC 降序排列。ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定義視窗範圍:從分組第一列到當前列。| 指標 | 相關子查詢 | 視窗函數 |
|---|---|---|
| 時間複雜度 | O(N²) 最壞 | O(N log N) 排序後單掃 |
| 執行計畫 | Nested Loops / Spool | Window Aggregate / Sort |
| 大數據量(>10萬列) | 明顯變慢 | 穩定高效 |
Month 欄位建議改為 DATE 或 YYYYMM 整數型別,避免字串排序陷阱(如 '2011/2' < '2011/10')。(UserName, Month) 大幅加速分組排序。