mariadb 윈도우함수 LAG, LEAD 활용하기

단밤v 2023. 9. 12. 23:28
728x90
반응형

안녕하세요.

 

이번 포스팅에서는

mariadb 윈도우 함수 중 LAG 함수와 LEAD함수에 대해

파헤쳐 볼까 합니다.

 

윈도우 함수에 대해 모르신다면

아래 클릭하셔서 개념을 보고 오세요.

 

 

 

LAG 함수 사용법

 

LAG 윈도우 함수는 데이터 집합내의

Record 이전의 Record의 컬럼값을 추출하는 함수입니다.

LAG의 사용 문법은 아래와 같습니다.

 

LAG (expr[, offset]) OVER ( 
  [ PARTITION BY partition_expression ] 
  [ ORDER BY order_list ]
)

 

LEAD 함수 사용법

 

LEAD 윈도우 함수는 데이터 집합내의

Record 이후의 Record의 컬럼값을 추출하는 함수입니다.

LEAD의 사용 문법은 아래와 같습니다.

 

LEAD (expr[, offset]) OVER ( 
  [ PARTITION BY partition_expression ] 
  [ ORDER BY order_list ]
)

 

LAG, LEAD 실제 사용 예시

 

LAG와 LEAD를 실제 사용해보기 전에

데이터를 아래와 같이 만들어 보겠습니다.

 

create table sales_performance(
 empname varchar(100) default '' not null comment '사원이름',
 sales int(20) default 0 not null comment '판매실적, 단위 천원'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO sales_performance (empname, sales) VALUES ('이남용', 115242);
INSERT INTO sales_performance (empname, sales) VALUES ('조현우', 104234);
INSERT INTO sales_performance (empname, sales) VALUES ('그녀석', 148531);
INSERT INTO sales_performance (empname, sales) VALUES ('홍길동', 95414);
INSERT INTO sales_performance (empname, sales) VALUES ('이진용', 104785);
INSERT INTO sales_performance (empname, sales) VALUES ('이순진', 115698);
INSERT INTO sales_performance (empname, sales) VALUES ('이용수', 85414);
INSERT INTO sales_performance (empname, sales) VALUES ('김진수', 121457);
INSERT INTO sales_performance (empname, sales) VALUES ('김타짜', 128541);
INSERT INTO sales_performance (empname, sales) VALUES ('최수진', 114569);
INSERT INTO sales_performance (empname, sales) VALUES ('김상호', 91423);
INSERT INTO sales_performance (empname, sales) VALUES ('김기섭', 154123);
INSERT INTO sales_performance (empname, sales) VALUES ('윤갑후', 100045);
INSERT INTO sales_performance (empname, sales) VALUES ('윤현정', 112345);
INSERT INTO sales_performance (empname, sales) VALUES ('이사라', 135657);
INSERT INTO sales_performance (empname, sales) VALUES ('하준수', 114578);

 

Q1. 해당 직원보다 높은 판매액을 달성한 바로 위의 직원 구하기

 

자신보다 바로 위의 직원명을 구해야되니

lag함수에 컬럼 empname을 넣고

over 안에 정렬 규칙을 판매액 컬럼인 sales를 내림차순으로 해서 구할 수 있다.

 

select 
 empname as "직원명",
 sales as "판매액",
 lag(empname) over(order by sales desc) 
 as "해당 직원 보다 높은 판매액을 달성한 바로 위의 직원" 
from sales_performance;

 

Q2. 해당 직원보다 낮은 판매액을 달성한 바로 아래의 직원 구하기

 

자신보다 바로 아래의 직원명을 구해야되니

lead함수에 컬럼 empname을 넣고

over 안에 정렬 규칙을 판매액 컬럼인 sales를 내림차순으로 해서 구할 수 있다.

 

select
 empname as "직원명",
 sales as "판매액",
 lead(empname) over(order by sales desc)
 as "해당 직원 보다 낮은 매출액을 달성한 바로 아래 직원"
from sales_performance;

 

 

SQL문을 익힐때는

직접 데이터를 만들고 직접 SQL문을 짜보셔야

실력이 금방금방 늘 수 있습니다.

 

눈으로만 보시지 마시고

꼭 실습을 해보시길 권장드려요 ^^

 

이상입니다.

 

 

감사합니다.

 

 

 

728x90
반응형