본문 바로가기

📢 들어가며

전 행의 데이터를 비교하여 같으면 ''을 다르면 원래 값을 리턴하는 로직 구현해야 했다.

 

Ag Grid 라이브러리에서 제공하는 valueFormatted, valueGetter, cellClassRulers 등을 사용할 때, 같은 데이터가 중복으로 2번 이상 타는 것이 문제였다. 중복으로 타면서 전 행의 데이터를 비교해야 하는데 자기 자신과 비교하게 되는 등의 문제가 발생했다.

 

이를 해결하고자 params.node.rowIndex를 받아서 체크하면서 해당 index보다 작으면 실행이 안되게 구현하였다.

 

적은 데이터일 때는 문제 없이 작동하는 듯 보였으나 무한 스크롤을 사용하는 서버 사이드 그리드이기에 스크롤할 때 문제가 발생한다.

 

결국, 이 문제는 서버에서 해결해야 했다.

 

알아보니 쿼리문에서 전 행의 데이터를 들고 올 수 있음을 알게 되었고 그와 관련된 lag와 lead에 관해 알아보자.

💡 Lag

Lag함수는 이전 행의 값을 리턴한다.

SELECT LAG(가져올 칼럼명, 행의 위치) OVER (ORDER BY 아래에 설정한 order by와 동일하게 한다) AS 새로운 칼럼명
FROM 테이블명
ORDER BY 정렬할 칼럼명

💬 예제

with TEMP_TABLE as (
	select 'kim' as first_name, 'minhee' as last_name
	union
	select 'kim' as first_name, 'yonghee' as last_name
	union
	select 'Lee' as first_name, 'siyoung' as last_name
	union
	select 'Lee' as first_name, 'sumin' as last_name
	union
	select 'Lee' as first_name, 'jisu' as last_name
	union
	select 'Park' as first_name, 'jihoon' as last_name
	union
	select 'Park' as first_name, 'yoonji' as last_name
	union
	select 'Gang' as first_name, 'jimin' as last_name
)

select lag(first_name, 1) over (order by first_name) as pre_first_name, first_name, last_name 
from TEMP_TABLE
order by first_name

💡 Lead

Lead함수는 다음 행의 값을 리턴한다.

SELECT LEAD(가져올 칼럼명, 행의 위치) OVER (ORDER BY 아래에 설정한 order by와 동일하게 한다) AS 새로운 칼럼명
FROM 테이블명
ORDER BY 정렬할 칼럼명

💬 예제

with TEMP_TABLE as (
	select 'kim' as first_name, 'minhee' as last_name
	union
	select 'kim' as first_name, 'yonghee' as last_name
	union
	select 'Lee' as first_name, 'siyoung' as last_name
	union
	select 'Lee' as first_name, 'sumin' as last_name
	union
	select 'Lee' as first_name, 'jisu' as last_name
	union
	select 'Park' as first_name, 'jihoon' as last_name
	union
	select 'Park' as first_name, 'yoonji' as last_name
	union
	select 'Gang' as first_name, 'jimin' as last_name
)

select lead(first_name, 1) over (order by first_name) as next_first_name, first_name, last_name 
from TEMP_TABLE
order by first_name

💡 그룹별 - Partition by

그룹지어 이전 행이나 다음 행을 봐야 할 때 partition by를 사용하면 된다.

그룹 칼럼 기준으로 이전 행의 값 또는 다음 행의 값을 표현한다.

SELECT LEAD(가져올 칼럼명, 행의 위치) OVER (PARITITION BY 그룹 할 칼럼명 ORDER BY 아래에 설정한 order by와 동일하게 한다) AS 새로운 칼럼명
FROM 테이블명
ORDER BY 정렬할 칼럼명

💬 예제

with TEMP_TABLE as (
	select 'kim' as first_name, 'minhee' as last_name
	union
	select 'kim' as first_name, 'yonghee' as last_name
	union
	select 'Lee' as first_name, 'siyoung' as last_name
	union
	select 'Lee' as first_name, 'sumin' as last_name
	union
	select 'Lee' as first_name, 'jisu' as last_name
	union
	select 'Park' as first_name, 'jihoon' as last_name
	union
	select 'Park' as first_name, 'yoonji' as last_name
	union
	select 'Gang' as first_name, 'jimin' as last_name
)


select lag(last_name, 1) over (partition by first_name order by first_name) as pre_first_name, first_name, last_name 
from TEMP_TABLE
order by first_name

개발의 각궁

Spring | Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Mybatis | JPA | Angular.js | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend