Как выбрать минимальную/максимальную дату из таблицы 2 на основе даты в таблице 1?

StackOverflow https://stackoverflow.com/questions/1641988

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top