DominikReber
Benutzer
- Beiträge
- 8
Hallo zusammen
Ich versuche mich seit gestern an der Lösung folgendes Problemes
MSSQL, Datenbank-Struktur ähnlich wie diese hier: (wobei other weitere rows sind, die ich teilweise auch auslesen muss):
Machinen-Typ | MaschineName | MyDate | State | other...
Machinen-Typ2 | Maschine1 | 2021-02-05 10:00:00 | A 43 | ....
Machinen-Typ1 | Maschine4 | 2021-02-05 12:00:00 | B 44 | ....
Machinen-Typ1 | Maschine2 | 2021-02-03 11:04:00 | B 64 | ....
Machinen-Typ1 | Maschine4 | 2021-02-09 13:06:00 | A 33 | ....
Machinen-Typ2 | Maschine1 | 2021-02-05 09:00:04 | C 34 | ....
Wobei: Jede Maschine ist einem Maschinen-Typ zugeordnet (also Maschine1 ist immer Maschinen-Typ2)
Nun möchte ich eine Auflisung aller Maschinen mit dem ERSTEN State 'B...'.
Also alle Maschinen gruppieren wo State LIKE 'B%' und danach nur die Zeile pro Maschine auswählen, wo B anhand MyDates das erste mal aufgetreten ist.
Folgendes hab ich verwendet, um das Gegenteil auszulesen: Pro MaschinenName den Status wo A als letztes aufgetreten ist:
;WITH cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY MaschineName ORDER BY MyDate DESC) AS rn FROM MyDatabase)
SELECT Machinen-Typ, MaschinenName, State, rowx, rowy
FROM cte
WHERE rn = 1 AND (State LIKE 'A%')
ORDER by Machinen-Typ, MaschinenName ASC;
Das funktioniert soweit gut.
Nun hab ich versucht, das ganze umzuschreiben, dass quasi das erste auftreten von B ausgelesen wird:
;WITH cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY MaschineName ORDER BY MyDate ASC) AS rn FROM MyDatabase)
SELECT Machinen-Typ, MaschinenName, State, rowx, rowy
FROM cte
WHERE rn = 1 AND (State LIKE 'B%')
ORDER by Machinen-Typ, MaschinenName ASC;
Komischerweise zeigt er mir dann genau 1 Resultat an. Das hat aber oben perfekt funktioniert.
Hat jemand einen Tipp, was ich falsch mache?
Danke!
Ich versuche mich seit gestern an der Lösung folgendes Problemes
MSSQL, Datenbank-Struktur ähnlich wie diese hier: (wobei other weitere rows sind, die ich teilweise auch auslesen muss):
Machinen-Typ | MaschineName | MyDate | State | other...
Machinen-Typ2 | Maschine1 | 2021-02-05 10:00:00 | A 43 | ....
Machinen-Typ1 | Maschine4 | 2021-02-05 12:00:00 | B 44 | ....
Machinen-Typ1 | Maschine2 | 2021-02-03 11:04:00 | B 64 | ....
Machinen-Typ1 | Maschine4 | 2021-02-09 13:06:00 | A 33 | ....
Machinen-Typ2 | Maschine1 | 2021-02-05 09:00:04 | C 34 | ....
Wobei: Jede Maschine ist einem Maschinen-Typ zugeordnet (also Maschine1 ist immer Maschinen-Typ2)
Nun möchte ich eine Auflisung aller Maschinen mit dem ERSTEN State 'B...'.
Also alle Maschinen gruppieren wo State LIKE 'B%' und danach nur die Zeile pro Maschine auswählen, wo B anhand MyDates das erste mal aufgetreten ist.
Folgendes hab ich verwendet, um das Gegenteil auszulesen: Pro MaschinenName den Status wo A als letztes aufgetreten ist:
;WITH cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY MaschineName ORDER BY MyDate DESC) AS rn FROM MyDatabase)
SELECT Machinen-Typ, MaschinenName, State, rowx, rowy
FROM cte
WHERE rn = 1 AND (State LIKE 'A%')
ORDER by Machinen-Typ, MaschinenName ASC;
Das funktioniert soweit gut.
Nun hab ich versucht, das ganze umzuschreiben, dass quasi das erste auftreten von B ausgelesen wird:
;WITH cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY MaschineName ORDER BY MyDate ASC) AS rn FROM MyDatabase)
SELECT Machinen-Typ, MaschinenName, State, rowx, rowy
FROM cte
WHERE rn = 1 AND (State LIKE 'B%')
ORDER by Machinen-Typ, MaschinenName ASC;
Komischerweise zeigt er mir dann genau 1 Resultat an. Das hat aber oben perfekt funktioniert.
Hat jemand einen Tipp, was ich falsch mache?
Danke!
Zuletzt bearbeitet: