Preseto를 사용하여 가로로 저장되는 동안 데이터를 세로로 저장
개시하다
SQL QueryEngine의 Preseto에는 가로로 저장되는 동안 데이터를 세로로 저장하는 방법이 적혀 있습니다.
Preseto의 서비스(Amazon Athena 등)를 이용한다면 기본적으로 적용될 수 있으며, 포스트지드래곤이나 MySQL의 RDB도 사용할 수 있다.아직 확인 못했습니다.
전제 조건
원래의 계약 데이터는 아래와 같다.
표 이름:contracttable
id
name
start_date
end_date
1
계약 A
2020-04-26
2020-09-03
2
계약 B
2021-05-19
2022-08-15
계약 기간을 통계하기 위해 다음과 같은 세로로 해주시기 바랍니다.
id
name
contract_month
1
계약 A
2020-04
1
계약 A
2020-05
1
계약 A
2020-06
1
계약 A
2020-07
1
계약 A
2020-08
1
계약 A
2020-09
2
계약 B
2021-05
2
계약 B
2021-06
2
계약 B
2021-07
2
계약 B
2021-08
먼저 대답하다
SELECT
id,
name,
date_format(contract_month, '%Y-%m')
FROM contract_table CROSS JOIN UNNEST(
sequence(
date_trunc('month',start_date),
date_trunc('month',end_date),
interval '1' month
)
) AS t(contract_month)
해설
SQL의 논리는 다음과 같다
start_데이터와end날짜를 토대로 제작 대상의 달 배열
이거 밑에 있어요.
sequence(
date_trunc('month',start_date),
date_trunc('month',end_date),
interval '1' month
)
sequence에서 반환하는 것은timestamp의 배열이다. 예를 들어 계약 A의 경우 다음과 같은 형식으로 반환된다.[
2020-04-26 00:00:00.000,
2020-05-26 00:00:00.000,
2020-06-26 00:00:00.000,
2020-07-26 00:00:00.000,
2020-08-26 00:00:00.000
]
단, 직접 사용하면 날짜에 따라 최종 월분은 위와 같이 빠질 수 있으므로 데이터트렁크에서는 월초에 원을 쓴다.또한 이번에 지정한 인터페이스는 1month이지만 15 days
처럼 임의의 인터페이스를 선택할 수도 있다.1의 배열을 행으로 확장하기
배열을 행으로 변환합니다.
contract_table CROSS JOIN UNNEST(
sequence(
date_trunc('month',start_date),
date_trunc('month',end_date),
interval '1' month
)
) AS t(contract_month)
이전 STEP에서 만든 배열을 unnest 함수의 매개 변수에 전송하여 자동으로 줄로 펼치고 표를 만듭니다.t(contract_month)
는 그것과 맞먹는다.이후 CROSS JOIN에서 원래 테이블과 Join을 진행하여 1개의 기록을 그룹에 복사합니다.
서식 적용 날짜
이것은 그리 대단한 처리가 아니다.
이번에는 아래 격식이지만 마음대로 성형하면 된다.
date_format(contract_month, '%Y-%m')
끝말
무엇이든 SQL로 너무 많이 처리하면 유지보수성이 떨어진다는 점에 주의해야 한다. 그러면 SQL로 처리해도 되잖아.
Reference
이 문제에 관하여(Preseto를 사용하여 가로로 저장되는 동안 데이터를 세로로 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/wonohe/articles/1ccd5162261fee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)