표 1의 날짜를 기준으로 표 2에서 Min/Max 날짜를 어떻게 선택합니까?
문제
월간 테이블이 있습니다 (첫 번째 요일의 행만 보유하고 있으며 각각의 고유 한 제약 조건)와 매일 비슷한 정보가있는 일일 테이블 (동일한 거래, 하루에 한 번).
Monthly table Daily table
------------- -----------
2009-01-01 2009-01-01
2009-02-01 2009-01-02
: : : :
2009-09-01 2009-01-31
2009-02-01
: :
2009-02-28
2009-03-01
: :
2009-09-01
그러나 날이없는 날이있을 수 있습니다.
월간 테이블의 각 날짜에 대해 해당 날짜와 일일 테이블의 해당 월의 최소 및 최대 날짜와 함께 반환하는 쿼리를 실행하고 싶습니다 (절대적으로 필요한 경우 표준 SQL을 사용하는 표준 SQL 사용).
따라서 1 월 마지막 주와 2 월 첫 주가 실종되면 필요합니다.
MonthStart FirstDay LastDay
---------- ---------- ----------
2009-01-01 2009-01-01 2009-01-24
2009-02-01 2009-02-08 2009-02-28
: :
2009-09-01 2009-09-01 2009-01-30
다음은 다음과 같습니다.
select m.date as m1,
dx.d1 as m2,
dx.d2 as m3
from monthly m,
( select min(d.date) as d1,
max(d.date) as d2
from daily d
where month(d.date) = month(m.date)
and year(d.date) = year(m.date)
) as dx;
하지만 오류가 발생합니다.
DSNT408I SQLCODE = -206, ERROR: M.DATE IS NOT A COLUMN OF
AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE IDENTIFIED
IN A FROM CLAUSE, OR IS NOT A COLUMN OF THE TRIGGERING
TABLE OF A TRIGGER
DSNT418I SQLSTATE = 42703 SQLSTATE RETURN CODE
누구 든지이 작업을 수행하는 방법에 대한 조언이 있습니까?
해결책
SELECT m.date as m1,
MIN(d.date) as m2,
MAX(d.date) as m3
-- COUNT(d.date) as NbOfDays -- if so desired...
FROM monthly m
JOIN daily d ON month(d.date) = month(m.date) and year(d.date) = year(m.date)
WHERE -- some condition
GROUP BY m.date
ORDER BY m.date -- or something else...
이 유형의 쿼리 (질문과 지금까지의 응답에 표시된 다른 쿼리와 마찬가지로, 테이블 스캔을 암시하므로 달 (x) 및 연도 (x)는 각 [예선]에 대해 계산 될 수 있기 때문에 비교적 느리게 진행됩니다. 행. (즉, Where 조항에 날짜에 범위를 두는 것).t이 계산 된 값에 열을 추가하는 데 유용 할 수 있습니다. (또는 결합 된 값 (연말)의 경우 계산이 불필요 할뿐만 아니라 기본 열 (들)을 색인화 할 수 있습니다.