SQL Tabelle mehrfach durchsuchen und dabei Datum vergleichen

aggitron

Commander
Registriert
Jan. 2006
Beiträge
2.074
Hallo,

bin leider kein SQL Spezialist und stehe vor einer, für mich, recht komplizierten Abfrage.

Ich habe eine Tabelle mit folgenden Werten

ID | Rasterposition | Datum von
4711 | 0 | 12.11.2010
4711 | 0 | 08.04.2009
4711 | 1 | 02.03.2007
4711 | 2 | 24.05.2008
4711 | 2 | 12.11.2010
4712 | 0 | 30.09.2012
4712 | 1 | 30.09.2012
4712 | 2 | 01.01.2013

Nun möchte ich von jeder ID den jeweils aktuellsten Rasterwert 0 (den gibt es immer mind. 1 mal je ID) mit Datum, plus
alle anderen Rasterwerte dieser ID wenn Sie ein Datum >= dem Datum vom jeweiligen Rasterwert 0 haben.

Entsprechend ist hier das erwartete Ergebnis:

ID | Rasterposition | Datum von
4711 | 0 | 12.11.2010
4711 | 2 | 12.11.2010
4712 | 0 | 30.09.2012
4712 | 1 | 30.09.2012
4712 | 2 | 01.01.2013

Kann mir jemand helfen?
 
SELECT CB.ID, CB.Rasterposition, MAX(DISTINCT CB.Datum) AS Datum
FROM CB INNER JOIN
CB AS CB_1 ON CB.ID = CB_1.ID AND CB.Rasterposition = CB_1.Rasterposition
WHERE (CB.Rasterposition = 0) OR
(NOT (CB.Rasterposition = 0)) AND (CB.Datum >=
(SELECT MAX(Datum) AS Expr1
FROM CB AS B
WHERE (Rasterposition = 0) AND (ID = CB.ID)))
GROUP BY CB.ID, CB.Rasterposition
ORDER BY CB.ID, CB.Rasterposition


ACHTUNG zeigt nur den höchsten Wert bei Datum, wenn mehrfach die Rasterposition mit einen höheren Wert als das Datum der Rasterposition 0 gibt.

Beispiel

4711 0 01.01.2010
4711 0 01.01.1999
4711 1 01.02.2010 wird nicht ausgegeben!
4711 1 01.03.2010

Ergebnis

4711 0 01.01.2010
4711 1 01.03.2010
 
Danke für deine Mühe.

Die Abfrage funktioniert einwandfrei. Wenn ich allerdings noch zusätzliche Felder in der obersten SELECT Anweisung hinzufügen möchte, stimmen die Ergebnisse nicht mehr. Woran kann das liegen, bzw. was ist in diesem Fall zu beachten?
Diese Felder haben keinen Einfluss auf die Selektion sondern enthalten nur zusätzliche Informationen.

Sieht dann praktisch so aus:

SELECT CB.ID, CB.Rasterposition, CB.KoordA, CB.KoordB, MAX(DISTINCT CB.Datum) AS Datum
FROM CB INNER JOIN
CB AS CB_1 ON CB.ID = CB_1.ID AND CB.Rasterposition = CB_1.Rasterposition
WHERE (CB.Rasterposition = 0) OR
(NOT (CB.Rasterposition = 0)) AND (CB.Datum >=
(SELECT MAX(Datum) AS Expr1
FROM CB AS B
WHERE (Rasterposition = 0) AND (ID = CB.ID)))
GROUP BY CB.ID, CB.Rasterposition, CB.KoordA, CB.KoordB
ORDER BY CB.ID, CB.Rasterposition, CB.KoordA, CB.KoordB
 
Zuletzt bearbeitet:
1. Erstelle eine neue View mit dem Namen "CB_View" mit folgenden Inhalt

SELECT ID, Rasterposition, MAX(DISTINCT Datum) AS Datum
FROM dbo.CB
WHERE (Rasterposition = 0) OR
(NOT (Rasterposition = 0)) AND (Datum >=
(SELECT MAX(Datum) AS Expr1
FROM dbo.CB AS B
WHERE (Rasterposition = 0) AND (ID = dbo.CB.ID)))
GROUP BY ID, Rasterposition

2. Benutze folgende Select Anweisung

SELECT CB.ID, CB.Rasterposition, CB.Datum, CB.KoordA, CB.KoordB
FROM CB RIGHT OUTER JOIN
CB_View ON CB.ID = CB_View.ID AND CB.Rasterposition = CB_View.Rasterposition AND CB.Datum = CB_View.Datum
ORDER BY CB.ID, CB.Rasterposition


Wenn es eine Eindeutige ID pro Zeile gibt, geht die Verknüpfung natürlich einfacher
 
Zuletzt bearbeitet:
Hab es hinbekommen. Vielen Dank für deine Unterstützung!
 
Zurück
Oben