숫자 변수에 대해 서로 다른 지연 값을 계산해야하므로 테이블을 완성하려고합니다. 테이블의 샘플은 다음과 같습니다.
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 행)로이 질문을 개발하려고합니다.
감사
항상 두 단계가 필요합니다.
문제는 고객에게 월간 차이가 있으므로이 달을 만들어야한다는 것입니다. 정확하게 : 각 클라이언트에 대해 최소 (월)에서 최대 (월)까지 모든 달을 생성하려고합니다. 클라이언트 당 모든 달이 있으면 테이블을 외부 조인 할 수 있습니다.
여기에서 읽기를 중지하고 내 쿼리를 확인하기 전에 직접 쿼리를 작성해 볼 수 있습니다.
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] 삭제
몇 마디 만하겠습니다