티스토리 뷰

SQL Server 2012 T-SQL New Feature – FIRST_VALUE, LAST_VALUE

 

SQL Server 2012에서 새롭게 제공되는 분석 함수 중에서 LAG, LEAD에 대한 내용을 살펴보았는데 이번에는 정렬된 값 집합의 첫번째 값과 마지막 값을 반환하는 함수를 알아보겠습니다.

FIRST_VALUE, LAST_VALUE 함수를 사용하면 어떤 시나리오에서는 손쉽게 원하는 결과를 구할 수 있을 것 같습니다.

 

먼저 FIRST_VALUE의 구문은 아래와 같습니다.

FIRST_VALUE ( [scalar_expression )

    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

간단한 예를 보는 것이 이해하기 훨씬 나을 듯 합니다. 아래 쿼리의 결과를 보시면 제품이름과 카테고리, 가격이 나타납니다.

SELECT Name,  [ProductSubcategoryID], [ListPrice]

FROM [Production].[Product]

WHERE [ProductSubcategoryID] IS NOT NULL

ORDER BY [ProductSubcategoryID], [ListPrice] 

 

 

추가로 위의 결과에 가장 낮은 가격과 가장 높은 가격을 나타내려면 서브 쿼리로 MAX, MIN을 사용할 수 있을 것입니다. 정렬된 결과 집합에 대한 최소가격의 경우 쿼리가 조인되고 필터 조건이 복잡하다면 쿼리 문이 복잡해지게 됩니다. FIRST_VALUE를 이용해서 가장 낮은 가격을 구하는 내용을 추가해보도록 하겠습니다.

SELECT Name,  [ProductSubcategoryID], [ListPrice]

, FIRST_VALUE( [ListPrice]) OVER (ORDER BY ListPrice ASC)

FROM [Production].[Product]

WHERE [ProductSubcategoryID] IS NOT NULL

ORDER BY [ProductSubcategoryID], [ListPrice] 

 

 

FIRST_VALUE 구문에서도 보는 것처럼 FIRST_VALUE 다음에 나타낼 값에 대한 열을 사용하고 OVER 구문에서 ORDER BY, PARTITION BY 를 사용할 수 있습니다. 아래는 카테고리별 분할된 내용에 대한 최소 가격과 최대 가격을 나타내는 구문입니다.

SELECT Name,  [ProductSubcategoryID],[ListPrice]

, FIRST_VALUE( [ListPrice]) OVER (PARTITION BY [ProductSubcategoryID] ORDER BY [ProductSubcategoryID] ) AS FirstValue

, LAST_VALUE( [ListPrice]) OVER (PARTITION BY [ProductSubcategoryID] ORDER BY [ProductSubcategoryID] ) AS LastValue

FROM [Production].[Product]

WHERE [ProductSubcategoryID] IS NOT NULL

ORDER BY [ProductSubcategoryID], [ListPrice] 

 

 

간략히 분석 함수 중에서 FIRST_VALUE, LAST_VALUE를 살펴보았습니다. 서브 쿼리로도 해결 가능하겠지만 특정 시나리오에서는 FIRST_VALUE, LAST_VALUE를 통해 간결하고 손쉽게 해결할 수 있습니다. 보다 더 자세한 내용은 아래 링크를 참고하실 수 있습니다. 

l  FIRST_VALUE(Transact-SQL)

http://msdn.microsoft.com/ko-kr/library/hh213018

l  LAST_VALUE(Transact-SQL)

http://msdn.microsoft.com/ko-kr/library/hh231517

 

 

댓글