먼저, 아래와 같은 데이터가 있다고 가정을 합니다.
A 파트의 데이터가 우리가 갖고 있는 user_id 기준으로 중복이 있는 tbl_user 라는 테이블입니다.
B 파트는 우리가 사용하고자 하는 user_id 기준으로 최신의 정보만 있는 "만들려고 하는 테이블" 입니다.
방법 1
첫번째 방법은 사용자(user_id)별로 updated_at 기준으로 번호를 생성하고, 최신의 데이터를 가져오는 방법입니다.
with
user_info as (
select user_id
, name
, phone
, address
, hobby
, row_number() over(partition by user_id order by updated_at desc) as ranking
from tbl_user
)
select * except(ranking)
from user_info
where ranking = 1
방법 2
두번째 방법은 사용자(user_id)로 그룹핑을 하고, 사용자별로 생기는 여러 값의 배열에서 최신 값을 가져오는 방법입니다.
select user_id
, ARRAY_AGG(name ORDER BY updated_at desc)[OFFSET (0)] as name
, ARRAY_AGG(phone ORDER BY updated_at desc)[OFFSET (0)] as phone
, ARRAY_AGG(address ORDER BY updated_at desc)[OFFSET (0)] as address
, ARRAY_AGG(hobby ORDER BY updated_at desc)[OFFSET (0)] as hobby
from tbl_user
group by user_id
방법 3
세번째 방법은 any_value 라는 펑션을 사용하는 방법입니다.
SELECT
u.user_id
, ANY_VALUE(u HAVING MAX(updated_at)).* EXCEPT (
user_id
)
FROM tbl_user u
GROUP BY u.user_id
'분석 > 데이터분석' 카테고리의 다른 글
그룹별로 랜덤 sampling 하기 (0) | 2024.08.27 |
---|---|
피처 스케일링 (Feature Scaling) (0) | 2024.05.22 |
머신러닝에서 인코딩 방법 (0) | 2024.05.22 |
회귀모델의 성과 측정 (0) | 2024.05.22 |
Recursive Query (재귀쿼리) (0) | 2024.03.12 |