💾DB

[PostgreSQL] LAG, LEAD 사용하기

이줭 2022. 7. 8. 21:45
728x90

LAGLEAD는 어떤 함수일까? 🤔

조회 결과 또는 결과 내 특정 집합 안에서 특정 컬럼의 이전 행의 값(LAG) 또는 다음 행의 값(LEAD)을 구하는 함수이다.

 

이전 또는 다음 행의 값을 구한다는 것은 알겠는데 어떤 경우에 사용되나요? 🙋‍♂️

 

아주 자주 쓰이는 함수는 아니지만, 이전 행의 값과 현재 값을 비교하거나 계산할 때 복잡하게 만들어야 하는 쿼리를 LAG, LEAD 함수를 쓰면 한 줄로 간단하게 끝낼 수 있다. 아래의 예시를 보자.

위와 같은 데이터가 있고, 총무팀의 3일 전 비용과 현재 비용을 비교하여 값이 오른 행만을 추출하려 한다면 어떻게 해야 할까? 복잡하게 보이지만 LAG 함수를 사용하면 3일 전 비용을 가져오는 컬럼을 만들 수 있다.

select *, lag(cost, 3) over(order by date) as lag_cost from cost_table

만약 3일 후의 값을 추출하고 싶다면, LEAD 함수를 사용하면 된다.

select *, lead(cost, 3) over(order by date) as lead_cost from cost_table

위의 예시에서는 팀이 총무팀 하나였기 때문에 별다른 문제가 없어 보였지만 만약 여러팀이 섞여있는 데이터의 경우 어떻게 될까? 단순 3일 전의 값을 조회하려 한다면 원하는 값을 얻지 못할 수도 있다. 의도하려던 것은 팀별 5일 전 조회 값일 것이다. 이러한 경우 partition by를 사용하여 그룹을 지어주고 조회할 수 있다.

-- 3일 전
select *, lag(cost, 3) over(partition by team order by date) as lag_cost from cost_table

-- 3일 후
select *, lead(cost, 3) over(partition by team order by date) as lead_cost from cost_table

위와 같이 사용할 수 있고, 앞서 말했듯이 아주 자주 사용하는 함수는 아니지만 알고 있으면 쓸모 있지 않을까하는 생각에 정리해본다.

 

참고 : https://dog-developers.tistory.com/158

https://minor-research.tistory.com/64

728x90

'💾DB' 카테고리의 다른 글

[ORACLE] DECODE와 CASE  (0) 2023.06.19
[ORACLE] INDEX 타지 않는 경우 (feat. INDEX HINT)  (0) 2022.09.15
[PostgreSQL] Extract 함수 (날짜 시간 추출)  (0) 2022.07.06
[PostgreSQL] pgAgent  (0) 2022.06.10
[PostgreSQL] UPDATE/DELETE JOIN  (0) 2022.01.24