소개
T-SQL의 새로운 함수 중 시계열 데이터 처리 관련 함수들만 별도로 분리했습니다.
시계열 데이터 처리 함수들 (신규 or 확장)
GENERATE_SERIES ( start , stop [ , step ] )
쉽게 얘기해서 원하는 형태의 일련번호(순번)를 생성해주는 함수입니다. 데이터 분석 언어인 Python의 arange() 혹은 R의 seq() 와 유사하고 심지어는 다른 RDBMS에서도 동일한 함수를 지원합니다. 위 문법과 아래 예제를 보면 쉽게 이해할 수 있습니다.
기존의 일련번호 생성을 위해 사용하던 접근 방식들 예를 들어, CROSS JOIN, VALUES(), CTE 등을 보다 쉽고 편하게 대체할 수 있습니다.
[예제] 간단한 예제코드입니다.
SELECT *
FROM GENERATE_SERIES(1, 9);
SELECT *
FROM GENERATE_SERIES(1, 10, 5);
GO
DECLARE @start decimal(2,1) = 0.0;
DECLARE @stop decimal(2,1) = 1.0;
DECLARE @step decimal(2,1) = 0.1;
SELECT value
FROM GENERATE_SERIES(@start, @stop, @step);
<div>
FIRST_VALUE ( [scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
OVER()를 이용한 시계열 데이터 분석에서 사용하던 기존 FIRST_VALUE(), LAST_VALUE() 함수에서 IGNORE NULLS와 RESPECT_NULLS 옵션이 추가되었습니다. 쉽게 얘기해서 지정 위치(FIRST or LAST)에 NULL 값이 있는 경우 이를 무시하고 그 다음 NULL이 아닌 값을 반환할지 아니면 기존처럼 NULL을 반환할지 지정할 수 있습니다. 즉 RESPECT NULLS가 기존 동일 동작입니다.
데이터 분석 영역에서 데이터의 NULL 혹은 유사 의미에 값이 있는 경우 이를 대체 처리하기 위한 여러가지 방법 중에 하나로 활용할 수 있습니다.
[예제] 간단한 예제코드입니다. CustomerID별 OrderDate 순으로 Frame 이동하면서 First 값 Last 값 검색
USE Northwind
/*
기본 동작
*/
SELECT
CustomerID
, OrderDate = CAST(OrderDate AS date)
, Freight
, FreightFIRST = FIRST_VALUE(Freight)
OVER(PARTITION BY CustomerID ORDER BY OrderDate ASC)
, FreightLAST = LAST_VALUE(Freight)
OVER(PARTITION BY CustomerID ORDER BY OrderDate ASC)
FROM (
SELECT CustomerID
, CASE WHEN Freight IN (29.46, 1.61, 11.99, 39.92) THEN NULL
ELSE Freight END AS Freight
, OrderDate
FROM dbo.Orders
) AS dv
ORDER BY CustomerID ASC, OrderDate ASC;
/*
IGNORE NULLS
*/
SELECT
CustomerID
, OrderDate = CAST(OrderDate AS date)
, Freight
, FreightFIRST = FIRST_VALUE(Freight) IGNORE NULLS
OVER(PARTITION BY CustomerID ORDER BY OrderDate ASC)
, FreightLAST = LAST_VALUE(Freight) IGNORE NULLS
OVER(PARTITION BY CustomerID ORDER BY OrderDate ASC)
FROM (
SELECT CustomerID
, CASE WHEN Freight IN (29.46, 1.61, 11.99, 39.92) THEN NULL
ELSE Freight END AS Freight
, OrderDate
FROM dbo.Orders
) AS dv
ORDER BY CustomerID ASC, OrderDate ASC;