다른 클라이언트에 대해 다른 범위를 사용하여 SQL-oracle에서 두 날짜 사이의 모든 달을 가져 오는 방법

Pau

숫자 변수에 대해 서로 다른 지연 값을 계산해야하므로 테이블을 완성하려고합니다. 테이블의 샘플은 다음과 같습니다.

CLIENT MONTH    VARIABLE
1      201705   45
1      201706   33
2      201603   11
2      201605   22
2      201606   12

숫자 변수에 대해 누락 된 월과 null 값이있는 행을 추가하여 테이블을 완성해야합니다. 이 예에서 이상적인 솔루션은 다음과 같습니다.

CLIENT MONTH    VARIABLE
1      201705   45
1      201706   33
2      201603   11
2      201604   NULL
2      201605   22
2      201606   12

힌트 (또는 ...) :

이 문제를 해결하기 위해 다음을 수행 할 수 있습니다.

1) 주어진 두 날짜 사이의 모든 달을 가져옵니다.

SELECT TO_CHAR(ADD_MONTHS(TO_DATE('201304', 'YYYYMM'), LEVEL - 1), 'YYYYMM') MONTHS
FROM DUAL
CONNECT BY LEVEL <= MONTHS_BETWEEN(TO_DATE('201708', 'YYYYMM'), TO_DATE('201304', 'YYYYMM'));

2) 각 클라이언트에 대한 최소 및 최대 날짜를 얻습니다.

SELECT CLIENT, MIN(MONTH) AS MIN_MONTH, MAX(MONTH) AS MAX_MONTH FROM TABLE1 GROUP BY CLIENT;

PD : 우리는 매우 방대한 데이터 세트 (+300.000.000 행)로이 질문을 개발하려고합니다.

감사

Thorsten Kettner

항상 두 단계가 필요합니다.

  1. 알고리즘 찾기
  2. 쿼리 작성

1 단계

문제는 고객에게 월간 차이가 있으므로이 달을 만들어야한다는 것입니다. 정확하게 : 각 클라이언트에 대해 최소 (월)에서 최대 (월)까지 모든 달을 생성하려고합니다. 클라이언트 당 모든 달이 있으면 테이블을 외부 조인 할 수 있습니다.

여기에서 읽기를 중지하고 내 쿼리를 확인하기 전에 직접 쿼리를 작성해 볼 수 있습니다.

2 단계

with pairs (client, month) as
(
  select client, min(month) as month from mytable group by client
  union all
  select client, case when mod(month, 12) > 0 then month + 1 else month + 89 end as month
  from pairs
  where month < (select max(m.month) from mytable m where m.client = pairs.client)
)
select client, month, m.variable
from pairs 
left join mytable m using (client, month)
order by client, month;

여기 Oracle 대신 표준 SQL의 재귀 CTE를 사용하고 CONNECT BY있습니다. 같은 일을합니다. CONNECT BY연습을 위해 내 쿼리를 쿼리로 번역 할 수 있습니다 . 그러나 일반적으로 Oracle 전용 쿼리보다는 표준 SQL 쿼리를 작성하는 것이 좋습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관