Как выбрать минимальные / максимальные даты из таблицы 2 на основе даты в таблице 1? - PullRequest
0 голосов
/ 29 октября 2009

У меня есть месячная таблица (содержит только строки с первым днем ​​месяца и уникальным ограничением, поэтому только по одному для каждого) и дневная таблица с похожей информацией для каждого дня (та же сделка, только одна в день):

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

У кого-нибудь есть советы, как лучше всего это сделать?

1 Ответ

2 голосов
/ 29 октября 2009
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.) Если этот тип запроса выполняется часто и размер таблицы значительный, то i t может быть полезно добавить столбец для этих вычисленных значений (или, возможно, для объединенного значения (год-месяц), так что не только вычисления не нужны, но и базовые столбцы могут быть проиндексированы.

...