Как выбрать минимальную/максимальную дату из таблицы 2 на основе даты в таблице 1?
Вопрос
У меня есть ежемесячная таблица (содержит только строки с первым днем месяца и уникальным ограничением, поэтому только по одной) и ежедневная таблица с аналогичной информацией для каждого дня (та же сделка, только одна в день):
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, предпочтительно специфичный для DB2, если это абсолютно необходимо).
Итак, если последняя неделя января и первая неделя февраля отсутствуют, мне нужно:
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, конечно, помогло бы).Если этот тип запроса выполняется часто и если размер таблицы значителен, яМожет быть полезно добавить столбец для этих вычисленных значений (или, возможно, для объединенного значения (Год-Месяц), чтобы не только не было необходимости в вычислениях, но и можно было проиндексировать базовые столбцы.