Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

SQL Server 2012 FIRST_VALUE 函數深度解析與實戰應用

編輯:XP 系統基礎知識

FIRST_VALUE 函數核心概念

SQL Server 2012 引入的 FIRST_VALUE 是一個窗口函數,用於返回結果集中指定欄位的第一個值。雖然其功能類似 TOP 1,但結合 OVER() 子句後,能實現更靈活的分組與排序邏輯,是資料分析與報表開發的利器。

測試資料準備

首先建立一個臨時表 @TestData,模擬員工薪資資料,包含部門、姓氏與時薪欄位:

DECLARE @TestData TABLE(
    ID INT IDENTITY(1,1),
    Department VARCHAR(20),
    LastName VARCHAR(20),
    Rate FLOAT
);

INSERT INTO @TestData(Department, LastName, Rate) 
SELECT 'Document Control','Arifin',17.7885 UNION ALL
SELECT 'Document Control','Norred',16.8269 UNION ALL
SELECT 'Document Control','Kharatishvili',16.8269 UNION ALL
SELECT 'Information Services','Chai',10.25 UNION ALL
SELECT 'Information Services','Berge',10.25 UNION ALL
SELECT 'Information Services','Trenary',50.4808 UNION ALL
SELECT 'Information Services','Conroy',39.6635 UNION ALL
SELECT 'Information Services','Ajenstat',38.4615 UNION ALL
SELECT 'Information Services','Wilson',38.4615 UNION ALL
SELECT 'Information Services','Connelly',32.4519 UNION ALL
SELECT 'Information Services','Meyyappan',32.4519;

SELECT * FROM @TestData;

測試資料結果集

基本用法:依 ID 正序與倒序取值

透過 OVER (ORDER BY ID) 決定「第一列」的定義。以下查詢新增欄位 FirstName,分別展示 ID 遞增與遞減時的第一筆 LastName:

-- ID 正序:第一筆為 Arifin
SELECT 
    *,
    FIRST_VALUE(LastName) OVER (ORDER BY ID) AS FirstName_ASC
FROM @TestData;

-- ID 倒序:第一筆為 Meyyappan
SELECT 
    *,
    FIRST_VALUE(LastName) OVER (ORDER BY ID DESC) AS FirstName_DESC
FROM @TestData;

ID 正序結果 ID 倒序結果

進階應用:搭配 PARTITION BY 分區

加入 PARTITION BY Department 後,函數會在各部門內部獨立計算第一值。同樣受 ORDER BY 影響,可依薪資高低、姓名筆畫等自訂排序:

SELECT 
    *,
    FIRST_VALUE(LastName) OVER (PARTITION BY Department ORDER BY Rate DESC) AS HighestPaid_PerDept
FROM @TestData;

分區後結果

補充說明:LAST_VALUE 與常見誤區

對應的 LAST_VALUE 同樣存在,但預設視窗框架為 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,直接使用常不符預期,需顯式指定 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 才能正確取得分區最後一值。此處不再贅述,留待後續專文探討。

Copyright © Windows教程網 All Rights Reserved