Guten Abend Zusammen !
Ich bin ein relativer SQL Neuling und arbeite mit MS SQL 2005 und Delphi.
Meine Suche im Forum hat nichts ergeben, da ich auch nicht so ganz sicher weiss, welche Suchbegriffe mich bei folgendem Problem weiterbringen:
Ich werte innerhalb einer Datenbank 2 Tabellen mit Zeitstempeln und zugeordneter Produktnummer mit folgendem Ergebnis aus:
Zeitstempel ProduktNr Produktbezeichnung
2008-09-19 08:05:14.000 14 AAAAAAA
2008-09-19 08:05:16.000 14 AAAAAAA
...
2008-09-19 12:43:48.000 14 AAAAAAA
2008-09-19 12:44:07.000 14 AAAAAAA
2008-09-19 13:46:44.000 17 BBBBBB
2008-09-19 13:46:45.000 17 BBBBBB
....
2008-09-19 18:55:21.000 17 BBBBBB
2008-09-19 18:55:32.000 17 BBBBBB
2008-09-19 18:56:14.000 18 CCCCC
2008-09-19 18:57:05.000 18 CCCCC
....
2008-09-19 19:26:17.000 18 CCCCC
2008-09-19 19:36:24.000 18 CCCCC
2008-09-20 08:54:47.000 14 AAAAAAA
2008-09-20 09:02:48.000 14 AAAAAAA
Ich würde die Abfrage gerne so gestalten, dass jeweils nur die Sätze mit "neuer" ProduktNr ausgegeben werden,also ungefähr so:
Zeitstempel ProduktNr Produktbezeichnung
2008-09-19 08:05:14.000 14 AAAAAAA
2008-09-19 13:46:44.000 17 BBBBBB
2008-09-19 18:56:14.000 18 CCCCC
2008-09-20 08:54:47.000 14 AAAAAAA
Ich habe schon eine Abfrage mit MIN und MAX im GROUP BY probiert, das hat den Nachteil, dass eine mehrfach auftretende ProduktNr (hierz.B. 14) nur einmal ausgegeben wird:
SELECT MIN(Zeit) as Start, MAX(Zeit) as Ende, Nr as ProduktNummer
FROM Ereignis INNER JOIN
Wert ON Ereignis.ID = Wert.Ereignis_ID
AND Ereignis.Zeit BETWEEN '11.09.2008 08:00:00' AND '15.09.2008 16:00:00'
INNER JOIN
Products ON Wert.Nr = Products.Nummer
GROUP BY Nr
ORDER BY Start
Die Lösung in Delphi ist so umgesetzt, dass ich mir die komplette Abfrage ausgeben lasse und jeweils Zeile n und n+1 auf Änderung vergleiche. Das ist jedoch aufwendig und braucht eine menge Ressourcen.
Hat jemand eine Idee, wie das Problem elegant in SQL gelöst werden kann ?
Grüsse
Tom
Ich bin ein relativer SQL Neuling und arbeite mit MS SQL 2005 und Delphi.
Meine Suche im Forum hat nichts ergeben, da ich auch nicht so ganz sicher weiss, welche Suchbegriffe mich bei folgendem Problem weiterbringen:
Ich werte innerhalb einer Datenbank 2 Tabellen mit Zeitstempeln und zugeordneter Produktnummer mit folgendem Ergebnis aus:
Zeitstempel ProduktNr Produktbezeichnung
2008-09-19 08:05:14.000 14 AAAAAAA
2008-09-19 08:05:16.000 14 AAAAAAA
...
2008-09-19 12:43:48.000 14 AAAAAAA
2008-09-19 12:44:07.000 14 AAAAAAA
2008-09-19 13:46:44.000 17 BBBBBB
2008-09-19 13:46:45.000 17 BBBBBB
....
2008-09-19 18:55:21.000 17 BBBBBB
2008-09-19 18:55:32.000 17 BBBBBB
2008-09-19 18:56:14.000 18 CCCCC
2008-09-19 18:57:05.000 18 CCCCC
....
2008-09-19 19:26:17.000 18 CCCCC
2008-09-19 19:36:24.000 18 CCCCC
2008-09-20 08:54:47.000 14 AAAAAAA
2008-09-20 09:02:48.000 14 AAAAAAA
Ich würde die Abfrage gerne so gestalten, dass jeweils nur die Sätze mit "neuer" ProduktNr ausgegeben werden,also ungefähr so:
Zeitstempel ProduktNr Produktbezeichnung
2008-09-19 08:05:14.000 14 AAAAAAA
2008-09-19 13:46:44.000 17 BBBBBB
2008-09-19 18:56:14.000 18 CCCCC
2008-09-20 08:54:47.000 14 AAAAAAA
Ich habe schon eine Abfrage mit MIN und MAX im GROUP BY probiert, das hat den Nachteil, dass eine mehrfach auftretende ProduktNr (hierz.B. 14) nur einmal ausgegeben wird:
SELECT MIN(Zeit) as Start, MAX(Zeit) as Ende, Nr as ProduktNummer
FROM Ereignis INNER JOIN
Wert ON Ereignis.ID = Wert.Ereignis_ID
AND Ereignis.Zeit BETWEEN '11.09.2008 08:00:00' AND '15.09.2008 16:00:00'
INNER JOIN
Products ON Wert.Nr = Products.Nummer
GROUP BY Nr
ORDER BY Start
Die Lösung in Delphi ist so umgesetzt, dass ich mir die komplette Abfrage ausgeben lasse und jeweils Zeile n und n+1 auf Änderung vergleiche. Das ist jedoch aufwendig und braucht eine menge Ressourcen.
Hat jemand eine Idee, wie das Problem elegant in SQL gelöst werden kann ?
Grüsse
Tom
Comment