📢 들어가며
전 행의 데이터를 비교하여 같으면 ''을 다르면 원래 값을 리턴하는 로직 구현해야 했다.
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
'DataBase > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] WITH ORDINALITY를 사용하여 원하는 순서로 정렬하기 (0) | 2022.08.01 |
---|---|
[PostgreSQL] USING (1) | 2022.08.01 |
[PostgreSQL] 구분자로 구분된 문자열을 array 배열로 받기(split_part, string_to_array, unnest) (0) | 2022.02.21 |
[PostgreSQL] drop, delete, truncate의 차이점 (1) | 2022.02.21 |
[PostgreSQL] 프로시저(Procedure) (0) | 2021.12.27 |