FIRST_VALUE 回傳視窗中第一列的指定運算式值,受 OVER (ORDER BY ...) 控制「第一列」定義。本文示範基本用法、排序方向影響、PARTITION BY 分組首值、與 LAST_VALUE 的關係。
DECLARE @TestData TABLE (
ID INT IDENTITY(1,1), Department VARCHAR(20), LastName VARCHAR(20), Rate FLOAT
);
-- 插入 11 筆測試資料...
SELECT
ID, Department, LastName,
FIRST_VALUE(LastName) OVER (ORDER BY ID) AS FirstUser
FROM @TestData;
所有列的 FirstUser 均為 'Arifin' (ID=1 的 LastName)。
SELECT
ID, Department, LastName,
FIRST_VALUE(LastName) OVER (ORDER BY ID DESC) AS FirstUserDesc
FROM @TestData;
所有列的 FirstUserDesc 均為 'Meyyappan' (ID=11 的 LastName)。
SELECT
Department, LastName,
FIRST_VALUE(LastName) OVER (PARTITION BY Department ORDER BY ID) AS FirstInDept
FROM @TestData;
結果:
SELECT
Department, LastName,
FIRST_VALUE(LastName) OVER (PARTITION BY Department ORDER BY ID DESC) AS LastInDept
FROM @TestData;
各群組首值變為該群組 ID 最大者 (Document Control → 'Kharatishvili', Information Services → 'Meyyappan')。
LAST_VALUE 對應取得視窗中「最後一列」的值,但預設視窗框架為 RANGE UNBOUNDED PRECEDING AND CURRENT ROW,導致直接使用時回傳「目前列」而非真正最後一列。
SELECT
ID, LastName,
LAST_VALUE(LastName) OVER (
ORDER BY ID
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS TrueLastValue
FROM @TestData;
必須顯式指定 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 擴展視窗至完整分區。
| 函數 | 預設視窗框架 | 需顯式框架 | 典型用途 |
|---|---|---|---|
| FIRST_VALUE | RANGE UNBOUNDED PRECEDING AND CURRENT ROW | 通常不需 (首值即在框架內) | 基準值比較、填補首值 |
| LAST_VALUE | RANGE UNBOUNDED PRECEDING AND CURRENT ROW | 必須 (預設框架不含未來列) | 末值比較、填補尾值 |
Rate / FIRST_VALUE(Rate) OVER (PARTITION BY Dept ORDER BY Date) AS RateRatioCASE WHEN ID = FIRST_VALUE(ID) OVER (...) THEN 1 ELSE 0 ENDFIRST_VALUE 直觀易用,LAST_VALUE 需注意視窗框架陷阱,兩者搭配 PARTITION BY 能解決多數「群組首/尾值傳播」需求。