¿Cómo selecciono las fechas mín. / Máx. De la tabla 2 según la fecha de la tabla 1?
Pregunta
Tengo una tabla mensual (solo contiene filas con el primer día del mes y una restricción única por lo que solo una de cada una) y una tabla diaria con información similar para cada día (misma oferta, solo una por día):
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
pero pueden faltar días.
Quiero ejecutar una consulta que devuelva, para cada fecha en la tabla mensual, esa fecha junto con las fechas mínima y máxima para ese mes en la tabla diaria (usando SQL estándar preferiblemente específico de DB2 si es absolutamente necesario).
Entonces, si falta la última semana de enero y la primera semana de febrero, necesito:
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
Aquí está la consulta que tengo:
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;
pero recibo el error:
DSNT408I SQLCODE = -206, ERROR: M.DATE NO ES UNA COLUMNA DE
UNA TABLA INSERTADA, UNA TABLA ACTUALIZADA O CUALQUIER TABLA IDENTIFICADA
EN UNA CLÁUSULA DE, O NO ES UNA COLUMNA DEL DISPARO
TABLA DE UN DISPARADOR
DSNT418I SQLSTATE = 42703 CÓDIGO DE RETORNO DE SQLSTATE
¿Alguien tiene algún consejo sobre la mejor manera de hacer esto?
Solución
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...
Tenga en cuenta que este tipo de consulta (como las otras que se muestran en la pregunta y en las respuestas hasta ahora, son relativamente lentas, ya que implican un escaneo de tabla para que se puedan calcular el mes (x) y el año (x) para cada [calificación] fila (es decir, poner un rango en la fecha en la cláusula WHERE, por supuesto, ayudaría). Si este tipo de consulta se ejecuta con frecuencia y si el tamaño de la tabla es significativo, i t puede ser útil para agregar un columna para estos valores calculados (o posiblemente para el valor combinado (Año-Mes)), de modo que no solo el cálculo sea innecesario sino que las columnas subyacentes puedan indexarse.