Frage

Ich habe eine monatliche Tabelle (nur Zeilen mit dem ersten Tag des Monats gilt, und eindeutige Einschränkung, so dass nur eine von jedem) und einer täglichen Tabelle mit ähnlichen Informationen für jeden Tag (die gleichen Sache, nur einem pro Tag):

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

aber es kann Tage fehlen.

Ich möchte eine Abfrage auszuführen, die für jedes Datum in der monatlichen Tabelle zurückgibt, dieses Datum zusammen mit dem minimalen und maximalen Termine für diesen Monat in der Tagestabelle (mit Standard-SQL vorzugsweise von DB2-spezifische, wenn es unbedingt erforderlich).

Also, wenn die letzte Januarwoche und ersten Februarwoche fehlt, ich brauche:

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

Hier ist die Abfrage ich habe:

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;

, aber ich bin immer die Fehlermeldung:

  

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

Hat jemand irgendwelche Ratschläge, wie man am besten, dies zu tun?

War es hilfreich?

Lösung

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...
Hinweis

, dass diese Art der Abfrage (wie die anderen bisher in der Frage und in Reaktionen gezeigt, relativ langsam ist, da sie eine Tabelle scannen, um den Monat (x) und Jahr (x) bedeuten kann für jeden berechnet werden [Qualifikation] Reihe. (dh einen Bereich auf Datum in der WHERE-Klausel Hilfe wäre natürlich setzen). wenn diese Art der Abfrage lief häufig wird und wenn die Größe der Tabelle signifikant ist, i kann t sinnvoll sein, ein hinzufügen Spalt für diese berechneten Werte (oder möglicherweise für den kombinierten Wert (Jahr-Monat), so dass nicht nur die Berechnung ist nicht erforderlich, aber die zugrunde liegende Spalte (n) kann indiziert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top