Preseto를 사용하여 가로로 저장되는 동안 데이터를 세로로 저장

2463 단어 SQLathenaprestotech

개시하다


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날짜에 따라 제작 대상 월의 배열
  • 1의 정렬을 행으로 확장
  • 포맷 날짜
  • 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로 처리해도 되잖아.

    좋은 웹페이지 즐겨찾기