SQL select TOP 1 for each “x” where y = z

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!
 
Zuletzt bearbeitet:
Werbung:
Ich seh gerade das Problem: Ich hab bei den MyDates für alle Maschinen einen Wert '1970-01-01 00:00:00' drin.

Also hab ich bei der ersten Abfrage schon einen Fehler drin, und zwar funktioniert die Abfrage hier nur korrekt, wenn MyDate nicht exakt gleiche Zeitwerte hat.
Daher liest er mir auch nur einen aus, da er anhand 1970... gruppiert und das natürlich dann für jede Maschine auftritt und daher gibt er nur 1 Wert aus.

Die Frage ist nur: Wie kann ich das Problem lösen?

Herzlichen Dank
 
Werbung:
Das Problem kannst du nur lösen, indem du korrekte Dati einträgst :)

Ich habe mal versucht deinen Code nachzuvollziehen.. Wenn du das korrekte Datum drin hast geht das ganz gut. Ansonsten vllt so:
upload_2021-8-4_7-54-59.png
 
Zurück
Oben