В связи с вопросом, который я задал ранее здесь , я обнаружил проблему, которая ускользает от меня (очевидно).
Первоначальный вопрос заключался в том, как выбрать минимальную и максимальную дату из ежедневной таблицы на основе месячной таблицы, где могут отсутствовать некоторые даты ежедневной таблицы. В основном мне были нужны столбцы, содержащие дату месяца (всегда первую), самую раннюю дату этого месяца в ежедневной таблице и самую последнюю дату этого месяца в ежедневной таблице.
Итак, если последняя неделя января и первая неделя февраля отсутствовали в ежедневном столе (а у нас были все даты на январь и февраль, но не более), мне нужно было:
MonthStart DayFirst DayLast
---------- ---------- ----------
2009-01-01 2009-01-01 2009-01-24
2009-02-01 2009-02-08 2009-02-28
Ответ был:
select
m.date as m1,
min(d.date) as m2,
max(d.date) as m3
from monthly m
join daily d
on month(d.date) = month(m.date)
and year(d.date) = year(m.date)
group by m.date
order by m.date
, который работал на спецификации, которые я дал.
К сожалению, реальность кусается, и в ежемесячной таблице (и ежедневной таблице) есть несколько записей с одной и той же датой. В частности:
- даты:
2007-10-16
до 2007-10-30
(15 дней), 2007-11-01
до 2007-11-30
(30 дней) и 2007-12-01
до 2007-12-15
(15 дней).
- каждая дата имеет шесть строк в обеих таблицах (поскольку каждая из них имеет строку для трех системных имен и двух периодов.
Проблема в том, что я sum()
поле в месячной таблице, и новый запрос получает значения, которые слишком велики (по сравнению с предыдущим запросом, в котором не было объединения).
Агрегация изменяет запрос на:
select
m.date as m1,
sum(m.other_field), -- added this
min(d.date) as m2,
max(d.date) as m3
from monthly m
join daily d
on month(d.date) = month(m.date)
and year(d.date) = year(m.date)
group by m.date
order by m.date
Я думаю, что значения слишком высоки из-за перекрестного соединения, так как цифры для каждого месяца отсутствуют по постоянному коэффициенту, в зависимости от количества дней в ежедневной таблице за этот месяц.
У меня такой вопрос: как мне агрегировать поле в месячной таблице, не вводя этот фактор в игру и по-прежнему получать минимальные / максимальные даты из ежедневной таблицы за этот месяц?