나는 아래에 달력 쿼리와 테이블이 있습니다. 회원의 StartDate 및 종료일이 있습니다. 또한 내 캘린더 테이블에서 startDate를 기반으로 "Weekof"를 캡처했습니다. 그 weekof 중 언제라도 회원이 활동하고 있다면 그것을 포착하고 싶습니다. 예상 결과를 확인하십시오.날짜 범위를 기반으로 여러 행 만들기
SELECT DISTINCT
--CA.CALENDAR_DATE,
TO_CHAR(CALENDAR_DATE,'MM/DD/YYYY') AS CALENDAR_DATE
TO_CHAR(NEXT_DAY(CALENDAR_DATE, 'Monday') - 7, 'MM/DD/YY-') ||
TO_CHAR(NEXT_DAY(CALENDAR_DATE, 'Monday') - 1, 'MM/DD/YY') AS WEEK_OF_YEAR,
ROW_NUMBER() OVER (ORDER BY CALENDAR_DATE) AS MasterCalendar_RNK
FROM CALENDAR CA
WHERE 1=1
--AND CA.CALENDAR_DATE BETWEEN ADD_MONTHS(TRUNC(SYSDATE), -12) AND TRUNC(SYSDATE)
--AND CA.CALENDAR_DATE BETWEEN TRUNC(SYSDATE) -5 AND TRUNC(SYSDATE)
ORDER BY TO_DATE(CALENDAR_DATE,'MM/DD/YYYY') DESC
표
Member StartDate EndDate
A 1/31/17
B 2/1/17 2/15/17
예상 출력 :
Member StartDate EndDate Week_Of_Year Active
A 1/31/17 1/30/17-2/5/17 1
A 1/31/17 2/6/17-2/12/17 1
A 1/31/17 2/13/17-2/19/17 1
B 2/1/17 2/15/17 1/30/17/2/5/17 1
B 2/1/17 2/15/17 2/6/17-2/12/17 1
B 2/1/17 2/15/17 2/13/17-2/19/17 1
현재 쿼리 : 달력 쿼리는 현재 문자열을 생성하기 때문에
이WITH MASTER_CALENDAR AS (
SELECT TRUNC(SYSDATE) + 1 - LEVEL , A.CALENDAR_DATE
FROM (SELECT C.CALENDAR_DATE FROM MST.CALENDAR C WHERE 1=1 AND C.CALENDAR_DATE > SYSDATE-30 AND C.CALENDAR_DATE < SYSDATE) A
WHERE 1=1
CONNECT BY LEVEL <= 1 --NEED TO UPDATE?
ORDER BY A.CALENDAR_DATE DESC
),
ActiveMembers AS (
SELECT H.CLT_CLT_PGMID, H.START_DT
,CASE WHEN TRUNC(H.END_DT) = '1-JAN-3000'
THEN SYSDATE
ELSE TO_DATE(H.END_DT)
END AS END_DT
FROM H
WHERE 1=1
AND H.CLT_CLT_PGMID IN ('1','2','3')
)
SELECT CLT_CLT_PGMID, STARTDATE, ENDDATE, WEEK_OF_YEAR, ACTIVE -- but not week_start
FROM (
SELECT DISTINCT A.CLT_CLT_PGMID,
TO_CHAR(A.START_DT, 'MM/DD/YY') AS STARTDATE,
TO_CHAR(A.END_DT, 'MM/DD/YY') AS ENDDATE,
NEXT_DAY(CAL.CALENDAR_DATE, 'Monday') - 7 AS WEEK_START, -- for ordering later
TO_CHAR(NEXT_DAY(CAL.CALENDAR_DATE, 'Monday') - 7, 'MM/DD/YY-') ||
TO_CHAR(NEXT_DAY(CAL.CALENDAR_DATE, 'Monday') - 1, 'MM/DD/YY') AS WEEK_OF_YEAR,
1 AS ACTIVE
FROM ActiveMembers A
INNER JOIN MASTER_CALENDAR CAL ON CAL.CALENDAR_DATE BETWEEN A.START_DT AND A.END_DT
--BETWEEN TO_CHAR(A.START_DT,'MM/DD/YYYY') AND COALESCE(A.END_DT,(SYSDATE))
)
WHERE 1=1
ORDER BY
CLT_CLT_PGMID , STARTDATE, ENDDATE, WEEK_START
;
캘린더의 마지막 30 일만 필요하므로 결과에 대한 하위 쿼리를 추가했습니다. 연결 기준에 익숙하지 않지만 수준에 따라 연결을 <= 42에서 <= 1으로 변경했습니다.이 기능이 무엇인지 잘 모르겠습니다. 당신은 설명 할 수 있었고 쿼리는 예제에 대해 작동하지만 어떻게 해석 할 수 있습니까? – John
내 질문에 귀하의 대답에 따라 현재 질문이 표시됩니다. – John
@ John - 42는 connect-subquery가 반환하는 행 수를 제한합니다. 그 숫자와 특별한 관련성은 없으며, 예제 데이터에 대해 적어도 충분한 날짜를 생성하는 것을 선택했습니다. 해당 하위 쿼리를 자체적으로 실행하면 개별 날짜 범위가 생성됩니다. 42를 30으로 변경하면 마지막 42 개가 아닌 지난 30 일이 생성됩니다 (1로 변경하면 1 개의 날짜 만 표시됨). 하지만 캘린더 테이블에서 날짜를 가져 오는 경우 연결 필요가 전혀 없습니다. (저는 CTE가 귀하의 실제 데이터를 대표한다고 말했습니다.) –