일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- MSSQL 문자열
- 업무 자동화
- Selenium 환경
- Visual Studio 패키지에 실패했습니다.
- Nginx Reverse Proxy
- Vue configureWebpack
- 웹 자동화
- Vue.config
- spring
- tomcat
- vue.js
- SQLP
- javascript
- Visual Studio 2015 삭제
- Visual Studio 2015 설치
- .NET Core Proxy
- Visual Studio 2015 강제 삭제
- Visual Studio 재설치
- MSSQL 동적 쿼리
- 프록시 예제
- vue3
- Tomcat Error
- Vue3 configureWebpack
- Selenium 설치
- 리버스 프록시 예제
- 웹 크롤링
- .NET Core
- vue
- Visual Studio 강제 삭제
- 디자인 패턴 사례
- Today
- Total
금백조의 개발 블로그
[MSSQL]LAG, LEAD 함수를 이용한 이전행, 다음행 조회 방법 본문
서론
비즈니스 로직을 구현하다 보면 복잡하게 데이터를 조회하기 이전에 이전 행, 다음 행을 조회하면 간단히 문제가 해결되는 경우가 종종 있습니다. 따라서 오늘은 그 내용을 정리하기 위해 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
[LEAD(Transact-SQL)]
https://docs.microsoft.com/ko-kr/sql/t-sql/functions/lead-transact-sql?view=sql-server-ver15
'Database > SQL Server(MSSQL)' 카테고리의 다른 글
[MSSQL]FULL OUTER JOIN 개념 및 예제(FULL JOIN 합집합) (0) | 2021.07.17 |
---|---|
[MSSQL]분석 함수 개념 및 예제(윈도우 함수) (0) | 2021.07.09 |
[MSSQL]SSMS에서 쿼리 바로 가기 설정하기(SQL Server Management Studio) (0) | 2021.05.07 |
[MSSQL][SQLP]MERGE문을 사용하여 INSERT, UPDATE 한번에 처리(DML 튜닝) (0) | 2021.04.21 |
[MSSQL]스칼라 함수 정의 및 예제(Scalar Function) (0) | 2021.04.18 |