금백조의 개발 블로그

[MSSQL]LAG, LEAD 함수를 이용한 이전행, 다음행 조회 방법 본문

Database/SQL Server(MSSQL)

[MSSQL]LAG, LEAD 함수를 이용한 이전행, 다음행 조회 방법

금백조 2021. 6. 20. 14:26
반응형

서론

 

비즈니스 로직을 구현하다 보면 복잡하게 데이터를 조회하기 이전에 이전 행, 다음 행을 조회하면 간단히 문제가 해결되는 경우가 종종 있습니다. 따라서 오늘은 그 내용을 정리하기 위해 LAD, LEAD 함수를 이용하여 이전 행, 다음 행을 조회하는 방법에 대해 알아보겠습니다.

 


본론

 

[구문 형식]

 

LAG - 이전행 조회

SELECT LAG([대상 컬럼], [이전 offset], [기본값]) OVER (PARTITION BY [..] ORDER BY [..])

 

LEAD - 다음행 조회

SELECT LEAD([대상 컬럼], [다음 offset], [기본값]) OVER (PARTITION BY [..] ORDER BY [..])

 

[특징]

 

1. 이전, 다음 행의 데이터가 없으면 [기본값]이 반환됩니다.

2. 파티션 별로 나누어 (PARTITION BY) 수행할 수 있습니다.

3. SQL Server 2012(11.x) 이후 버전부터 사용이 가능합니다.

 

[예제]

 

IF OBJECT_ID('tempdb..#TEMP')
   IS NOT NULL DROP TABLE #TEMP

SELECT 'A1' AS ROOT_GROUP,'1' AS CHILD_GROUP,'다' AS CHILD_GROUP_NM,'ITEM1'AS ITEM, 100 AS QTY
INTO #TEMP
UNION ALL
SELECT 'A1','2','가','ITEM2', 200
UNION ALL
SELECT 'A1','1','다','ITEM3', 300
UNION ALL
SELECT 'A1','3','나','ITEM4', 500
UNION ALL
SELECT 'A1','3','나','ITEM5', 100
UNION ALL
SELECT 'A2','1','다','ITEM6', 100
UNION ALL
SELECT 'A2','3','나','ITEM7', 100
UNION ALL
SELECT 'A2','2','가','ITEM8', 100
UNION ALL
SELECT 'A3','1','다','ITEM9', 100

SELECT   ROOT_GROUP
	   , CHILD_GROUP
	   , CHILD_GROUP_NM
	   , LAG(CHILD_GROUP_NM,1,NULL) OVER (ORDER BY ROOT_GROUP, CHILD_GROUP) AS PREV_CHILD_GROUP_NM1
	   , LAG(CHILD_GROUP_NM,2,NULL) OVER (ORDER BY ROOT_GROUP, CHILD_GROUP) AS PREV_CHILD_GROUP_NM2
	   , LAG(CHILD_GROUP_NM,1,NULL) OVER (PARTITION BY ROOT_GROUP ORDER BY ROOT_GROUP, CHILD_GROUP) AS PREV_CHILD_GROUP_NM3
	   , LEAD(CHILD_GROUP_NM,1,NULL) OVER (ORDER BY ROOT_GROUP, CHILD_GROUP) AS NEXT_CHILD_GROUP_NM1
	   ,ITEM
	   , QTY
FROM #TEMP

 

[실행결과 분석]

 

PREV_CHILD_GROUP_NM1

 

ORDER BY로 정렬 후 현재행으로부터 이전행 조회

PREV_CHILD_GROUP_NM2

 

ORDER BY로 정렬 후 현재행으로부터 두 번째 앞에 있는 이전행 조회

 

 

PREV_CHILD_GROUP_NM3

 

PARTITION BY로 파티션을 먼저 나누고 ORDER BY로 정렬 후 현재행으로부터 이전행 조회

 

NEXT_CHILD_GROUP_NM1

 

ORDER BY로 정렬 후 현재행으로부터 다음행 조회

 

 

 


 

결론

 

LAG, LEAD 함수를 다시 한번 리마인드 하게 된 좋은 계기였습니다. 독자분들도 필요한 경우에 사용하여 이 글이 도움이 되었으면 좋겠습니다.

 

Reference

 

[LAG(Transact-SQL)]

https://docs.microsoft.com/ko-kr/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15 

 

LAG(Transact-SQL) - SQL Server

LAG(Transact-SQL)

docs.microsoft.com

 

[LEAD(Transact-SQL)]

https://docs.microsoft.com/ko-kr/sql/t-sql/functions/lead-transact-sql?view=sql-server-ver15 

 

LEAD(Transact-SQL) - SQL Server

LEAD(Transact-SQL)

docs.microsoft.com

 

반응형