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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top