Wie kann ich min / max stammt aus Tabelle 2 basiert auf Datum in der Tabelle 1 wählen?
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?
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.