DB/MySQL

[MySQL] LAG() 함수

동호다찌 2023. 1. 17. 11:49
반응형

 

 

순위함수(분석함수)

결과에 순번, 순위를 매기는 함수

비집계함수  RANK, NTILE, DENSE_RANK, ROW_NUMBER 등이 해당된다.

SELECT
<순위함수이름> (arguments)
OVER ([PARTITION BY <partion_by_list>]
ORDER BY <order_by_list>)
FROM 테이블명;

PARTITION BY : 동일 그룹으로 묶어줄 칼럼 명 지정

ORDER BY : Partition 정의에 지정된 컬럼에 대한 정렬 수행


LAG() 함수

 

LAG() 함수는 LEAD() 함수와 비슷합니다. 두 함수 모두 2개의 행 간의 차이를 구할 때 사용되곤 합니다.

 

두 함수의 차이점이라고 하면 LAG() 함수는 앞 행에서 값을 반환하고 LEAD() 함수는 뒷 행에서 값을 반환합니다.

 


 SELECT c.Code , 
        c.Name , 
        c.Continent , 
        c.Population ,
        LAG(Population) OVER(PARTITION BY Continent ORDER BY Population DESC) AS value,
        LAG(Population) OVER(PARTITION BY Continent ORDER BY Population DESC) - c.Population AS difference
   FROM country c ;

 

윈도우 함수가 사용된 문장을 보면 OVER() 구문 내에 인구수 기준으로 구분막(파티션)이 생겼습니다.  각 구분막 내에서 LAG() 함수는 열 sale_value의 기존 행 이전 행 값을 반환했습니다.

 

그래서 India의 인구수의 value는 이전 China인 값을 가져오고, Indonesia는 India의 인구수를 반환했습니다.

 

China같은 경우는 이전 값이 없으므로 Null값을 반환했습니다.

 

 

대륙 별 가장 높은 값과 본인의 인구수 차이를 계산

 SELECT c.Code , 
        c.Name , 
        c.Continent , 
        c.Population ,
        MAX(c.Population) OVER(PARTITION BY c.Continent ORDER BY Population DESC) AS continent_max_value,
        MAX(c.Population) OVER(PARTITION BY c.Continent ORDER BY Population DESC) - c.Population AS difference
   FROM country c 
  GROUP BY c.Code ;

반응형

'DB > MySQL' 카테고리의 다른 글

[MySQL] IFNULL()  (0) 2023.01.18
[MySQL] SUM() OVER()함수  (0) 2023.01.17
[MySQL] LEAD() 함수  (0) 2023.01.17
[MySQL] ROW_NUMBER() 함수  (0) 2023.01.17
[MySQL] DENSE_RANK() 함수  (0) 2023.01.17