SQL Server 2012 的 T-SQL 新功能 – 新的資料分析函數(FIRST_VALUE、LAST_VALUE)

本文將介紹 SQL Server 2012 的 T-SQL 新的資料分析函數 - FIRST_VALUE / LAST_VALUE

SQL Server 2012 提供各項的分析函數來幫助開發人員,可以用更有效率且容易維護的方式來撰寫 T-SQL,在上一篇筆者介紹 SQL Server 2012 新增的八大分析函數之中的 LEADLAG,本文將介紹另外兩個實用的分析函數 - FIRST_VALUELAST_VALUE

   1:  FIRST_VALUE ( [scalar_expression ) 
   2:      OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] ) 

當您將結果集進行排序或資料分割後,要取得整個結果集或資料分割的第一筆資料可以使用 FIRST_VALUE 函數。

下列程式碼示範如何依照 c2 欄位進行資料分割,並利用 FIRST_VALUE 函數取得每個分割的第一筆資料。

   1:  declare @t table
   2:  (
   3:      c1 int identity
   4:      ,c2 date
   5:  )
   6:   
   7:  insert into @t (c2)
   8:  select '20120101' 
   9:  union all
  10:   select '20120201' 
  11:   union all
  12:   select '20120110' 
  13:   union all
  14:   select '20120221' 
  15:   union all
  16:   select '20120121' 
  17:   union all
  18:   select '20120203' 
  19:   union all
  20:   select '20120311' 
  21:   union all
  22:   select '20120321' 
  23:   union all
  24:   select '20120331' 
  25:   
  26:   select c1,c2
  27:          ,FIRST_VALUE(c2) OVER (PARTITION BY MONTH(c2) 
  28:                                 ORDER BY c2) AS 每個資料分割的第一筆資料
  29:   from @t

執行結果如下:

image

   1:  LAST_VALUE ( [scalar_expression ) 
   2:      OVER ( [ partition_by_clause ] order_by_clause rows_range_clause ) 

當您將結果集進行排序或資料分割後,要取得整個結果集或資料分割的最後一筆資料可以使用 LAST_VALUE 函數。

下列程式碼示範如何依照 c2 欄位進行資料分割,並利用 LAST_VALUE 函數搭配 Window Frame 敘述取得每個分割的第後一筆資料。

   1:  declare @t table
   2:  (
   3:      c1 int identity
   4:      ,c2 date
   5:  )
   6:   
   7:  insert into @t (c2)
   8:  select '20120101' 
   9:  union all
  10:   select '20120201' 
  11:   union all
  12:   select '20120110' 
  13:   union all
  14:   select '20120221' 
  15:   union all
  16:   select '20120121' 
  17:   union all
  18:   select '20120203' 
  19:   union all
  20:   select '20120311' 
  21:   union all
  22:   select '20120321' 
  23:   union all
  24:   select '20120331' 
  25:   
  26:   select c1,c2
  27:          ,LAST_VALUE(c2) OVER (PARTITION BY MONTH(c2) 
  28:                                ORDER BY c2
  29:                                ROWS BETWEEN UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
  30:                                ) AS 每個資料分割的第後筆資料
  31:   from @t

執行結果如下:

image

【參考資料】