[DB2] Spezial abfrage

baeri

Erfahrenes Mitglied
Hallo ihr,
ich bin neu hier im Forum *party*...

ich möchte eine Spezialabfrage machen:
ich habe eine Datenbank (SQL) in der fast eine Millionen Datensätze sind, es werden täglich mehrere tausend Einträge allerdings überwiegend mit gleichen Material gemacht:
Code:
table1
ID   | MAT    | DATE       | ...
----------------------------
1    | M2     | 2014-09-01 | ...
2    | M1     | 2014-09-01 | ...
3    | M1     | 2014-09-02 | ...
4    | M3     | 2014-09-02 | ...
5    | M1     | 2014-09-02 | ...
6    | M3     | 2014-09-03 | ...
7    | M3     | 2014-09-03 | ...
8    | M3     | 2014-09-03 | ...
9    | M2     | 2014-09-04 | ...
ich will wissen von wann bis wann teile Produziert wurden ->
M2 -> vom 1.9. - 1.9.
M1 -> vom 1.9. - 2.9.
M3 -> vom 2.9. - 3.9.
M2 -> vom 4.9. - 4.9.
...

die Teile "können" etwas "durcheinander" sein -> d.h. das an einem Tag zwei teile erscheinen und das sogar überlaüüend
mein Zeitraum beginnt an dem Tag, wo das teil zum ersten mal Produziert wurde und endet an dem Tag wo das Teil zuletzt Produziert wurde -> sobald ein Tag Pause ist, soll ein neuer Zeitraum erscheinen...

Wie man eine abfrage macht ist mir klar, sogar wie man das mit WHERE einschränkt:
Code:
SELECT
   MAT, DATE
FROM
   table1
WHERE
   ???
aber eigentlich bringt mich das kein stück näher...

Wie könnte ich das umsetzen? Und ist das mit SQL überhaupt möglich?

Vielen Dank
baeri
 
GROUP BY, MAX() und MIN() sind die Befehle welche dir fehlen
SQL:
SELECT
    t.mat,
    MIN(t.date) AS start_date,
    MAX(t.date) AS end_date
FROM
    table1 t
GROUP BY
    t.mat
 
Morgen,
vielen Dank für die schnelle Antwort...
aber wäre es nicht so, das bei MIN(M2.Date) -> der 1.9. kommen würde und bei MAX(M2.Date) der 4.9. kommen würde?
ich will ja die Produktionsphasen von den Produktionspausen trennen!
 
hilft das was um eine Aussage zu treffen?
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" . "HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
 
Oh DB2. Ich setz das mal in den Titel und hoffe, dass es DB2-User gibt, die dir helfen können.

Bei MySQL, Oracle DB, MS SQL, MS Access, PostgreSQL und SQLLite hätte ich dir helfen können
 
Hi,
ich hatte in letzter Zeit auch viel mit DB2 zu kämpfen... wenn du was anderes nutzen kannst such dir was anderes!!! :D

das ist nicht viel, aber evtl. hilft dir das etwas...
Code:
SELECT 
            MAT, DATE
        FROM 
            table1 
        WHERE 
            DATE >= '".$from."' 
            AND DATE <= '".$till."' 
        GROUP BY
            MAT, DATE
        ORDER BY
            DATE

Jetzt hast du eine Liste mit allen MAT und Tagen...

weiter kann ich dir leider auch nicht helfen...
wenn du / oder jemand eine Lösung hat, wäre ich auch interessiert.
ich Verarbeite das Momentan in PHP weiter.
 
ca. so:
(Annahme ist, dass date tatsächlich nur bis auf den Tag genau ist und keine Zeitinformation enthält)
SQL:
SELECT
  t.mat,
  MIN(t.date) AS from_date,
  MAX(t.date) AS to_date
FROM
  (SELECT
    x.mat,
    x.date,
    ROW_NUMBER() OVER(PARTITION BY x.mat ORDER BY x.date) AS i
  FROM (SELECT DISTINCT mat, date FROM table1) x
  ) t
GROUP BY
  t.mat,
  DATEDIFF('DD',t.i,t.date)
ORDER BY
  from_date,
  to_date,
  t.mat
;

Code ist ungetestet, da ich DB2 eigentlich nicht kenne und testen kann. Evtl. heissen einige Funktionen da anders...
 
DATEDIFF funktioniert auf meiner DB2 nicht :/ ...

aber müsste ich nicht mir 'DD' <- für DAY Probleme bekommen, wenn ich nen Monatswechsel habe?
 
Code:
            SELECT
             t.MAT,
             MIN(t.DATE) AS from_date,
             MAX(t.DATE) AS to_date
            FROM
             (SELECT
                x.MAT,
                x.DATE,
                ROW_NUMBER() OVER(PARTITION BY x.MAT ORDER BY x.DATE) AS i
             FROM (SELECT DISTINCT MAT, DATE FROM administrator.table1 ) x
             ) t
            WHERE
              DATE >= '".$from."' 
             AND DATE <= '".$till."' 
            GROUP BY
             t.MAT,
             DATE(t.i) - DATE(t.DATE)
            ORDER BY
             from_date,
             to_date,
             t.MAT

läuft bei mir :)
vielen DANK
 
Zurück