Dev JS Blog

[Oracle] lead(), lag()는 뭐지? 본문

옛날 창고/SQL

[Oracle] lead(), lag()는 뭐지?

Dev JS 2018. 12. 26. 11:07
728x90

lead(), lag()는 뭐지? 




오늘은 기본 함수로 제공 되는 lead 와 lag 를 사용해보겠습니다.


사용방법은

lead() over(order by 정렬)

lag() over(order by 정렬)


으로 사용 하면됩니다.


오늘 사용할 ex_table


SELECT

no,

val

FROM ex_table



lead 부터 사용해보겠습니다.


SELECT

lead(no) over(order by no desc) AS lead_no,

no,

val

FROM ex_table



over 안에 있는 order by 에 따라 정렬이 되고 

no 데이터가 하나씩 위로 올라가있는 컬럼이 생성되었습니다.


이걸 보니 lag 는 무얼 할지 딱 감이 오시나요?


SELECT

lag(no) over(order by no desc) AS lag_no,

no,

val

FROM ex_table



lag 는 lead와는 반대로 

no 데이터가 하나씩 밀려있는 컬럼이 생성이 되었습니다.


그리고 

lead 와 lag 는 같이 사용도 가능합니다.


SELECT

lag(no) over(order by no desc) AS lag_no,

lead(no) over(order by no desc) AS lead_no,

no,

val

FROM ex_table



lead된 컬럼과 lag 된 컬럼이 하나씩 생성이 되었죠~~?!


둘이 동시에 쓰게 될때 주의해야 할 점은 뭘까요?


바로 order by 입니다

order by 를 서로 다르게 해보겠습니다.


SELECT

lag(no) over(order by no desc) AS lag_no,

lead(no) over(order by no asc) AS lead_no,

no,

val

FROM ex_table



lead가 되었고 order by 는 오름차순(ASC)를 따르게 되었네요

둘이 바꾼다면 ?


SELECT

lead(no) over(order by no asc) AS lead_no,

lag(no) over(order by no desc) AS lag_no,

no,

val

FROM ex_table



이번에는 내림차순에 lag 가 되었네요


이걸로 봤을때 order by 는 마지막꺼를 따라간다는걸 알수가 있습니다.


두개를 동시에 사용할때 order by에 주의하셔야합니다


이건 보통 이전 행과 그다음 행의 차를 구한다던지

(10일 10개판매 , 11일 12개판매 했다면 12개-10개 = > 2개판매증가) 이런식으로

활용할때 등등 으로 활용하겠죠?






728x90

'옛날 창고 > SQL' 카테고리의 다른 글

[Oracle] 행 데이터 한 열로 합치기  (2) 2019.01.07
[Oracle] ORA - 01861 에러  (0) 2019.01.05
[SQL] JOIN 에 대해서  (0) 2018.12.23
[Oracle] row_number() over() 활용  (0) 2018.12.21
[Oracle] order by 기초  (0) 2018.12.20
Comments