Unterabfrage

Gimli3311

Benutzer
Beiträge
6
Hallo zusammen,

ich steh gerade ziemlich auf den Schlauch und ich hoffe ihr könnt mir weiterhelfen.

Problem: Ich benötige den aktuellsten Datensatz jeder einzelnen MaschinenNr.

Beispieltabelle: MaschinenLog

Spalten:
MaschinenNr | Buchungsdatum |KennungsNr | StillstandsNr
1001 | 2016-11-09 10:38 | 210 | NULL
1002 |2016-11-09 10:40 | 210 |NULL
1001 |2016-11-09 10:12 | 200 | 103
1001 |2016-11-09 10:20 | 210 | 102
1001 |2016-11-09 10:47 |200 |NULL
1002 |2016-11-09 10:06 | 210 | 105



Ich möchte nun immer den aktuellste Datensatz der jeweiligen MaschineNr herausfinden.
Sprich im Beispiel oben wäre es:
MaschinenNr. 1001 mit dem Buchungsdatum 2016-11-09 10:12
MaschinenNr. 1002 mit dem Buchungsdatum 2016-11-09 10:06

Mit der Select-Abfrage:
Code:
SELECT TOP 1 FROM MaschinenLog ORDER BY Buchungsdatum DESC
bekomme ich zumindest den aktuellsten Datensatz der Tabelle zurück. Aber ich brauche jeweils den aktuellsten Datensatz jeder Maschinen.

Wäre es mit einer Unterabfrage möglich?


Ich hoffe Ihr könnte mir weiterhelfen.

Viele Grüße
Gimli3311
 
Zuletzt bearbeitet:
Werbung:
Hi,

das lässt sich mit der Fensterfunktion ROW_NUMBER() lösen.

Hier mal ein Beispiel:
Code:
WITH cte_Log
AS (
SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr
        LFD = ROW_NUMBER() OVER (PARTITION BY MaschinenNr ORDER BY Buchungsdatum DESC)
FROM MaschinenLog)

SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr
FROM cte_Log
WHERE LFD = 1

Je nach Datenumfang kann man innerhalb der CTE noch einen Filter mittels WHERE-Klausel einfügen (z.B. Filter auf einen Tag oder Monat)

Viele Grüße,
Tommi
 
Hi,

das lässt sich mit der Fensterfunktion ROW_NUMBER() lösen.

Hier mal ein Beispiel:
Code:
WITH cte_Log
AS (
SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr
        LFD = ROW_NUMBER() OVER (PARTITION BY MaschinenNr ORDER BY Buchungsdatum DESC)
FROM MaschinenLog)

SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr
FROM cte_Log
WHERE LFD = 1

Je nach Datenumfang kann man innerhalb der CTE noch einen Filter mittels WHERE-Klausel einfügen (z.B. Filter auf einen Tag oder Monat)

Viele Grüße,
Tommi


Hallo Tommi,

mit der Fensterfunktion ROW_NUMBER() hat es super funktioniert. Danke für deine Hilfe.


Es wurde nur ein Komma vergessen in der ersten SELECT-Abfrage hinter "StillstandsNr" <-- Für die User mit dem selben Problem wie ich:
Code:
WITH cte_Log
AS (
SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr,
        LFD = ROW_NUMBER() OVER (PARTITION BY MaschinenNr ORDER BY Buchungsdatum DESC)
FROM MaschinenLog)

SELECT    MaschinenNr,
        Buchungsdatum,
        KennungsNr,
        StillstandsNr
FROM cte_Log
WHERE LFD = 1


Viele Grüße
Gimli3311
 
Werbung:
Hallo zusammen,

habe noch einen Lösungsweg mit einer Unterabfrage gefunden, denn möchte ich euch nicht vorenthalten:

Code:
SELECT [MaschinenNr.]
,[Buchungsdatum]
,[KennungsNr]
,[StillstandsNr.]
FROM MaschinenLog as bde where [Buchungsdatum] = (SELECT MAX([Buchungsdatum]) FROM MaschinenLog AS mde where [mde].[MaschinenNr.] = bde.[MaschinenNr.] )

Schönen Tag
 
Zurück
Oben