2017-01-23 4 views
0

ich suche nach einer Abfrage, die mir für jede ID den letzten Datensatz (basierend auf Datum, das gegeben ist, und Zeitstempel).SQL Server-Abfrage; Letzter Datensatz für jede ID

In meinem Fall ist die ID "knr", also ich möchte den letzten Datensatz von jedem KNR in event_ap (mit pers_stm abgestimmt, um die Namen zu erhalten). Ich bin nur in der Lage, dieses Ergebnis für 1 ID zu erhalten, aber nicht für alle von ihnen.

Ich habe diese Tabellen (nur Beispiele, beide Tabellen haben über 10 Tausend Einträge)

event_ap 

Ereignis a_nr tnr date   time knr maschnr 
PAN  123  2203 2017-01-23 8:00 11 x222 
PAN  132  2203 2017-01-22 8:00 22 x222 
PAB  123  2203 2017-01-23 9:00 11 x222 
PAN  555  2203 2017-01-23 6:00 33 x222 
PAN  555  2201 2017-01-23 11:00 44 x222 
PAB  222  2202 2017-01-23 10:00 44 x222 

pers_stm 

name knr 
Test1 11 
Test2 22 
Test3 33 
Test4 44 

Was ich will diese

Ereignis tnr date  time knr name maschnr 
PAB  2203 2017-01-23 9:00 11 Test1 x222 
PAN  2203 2017-01-23 6:00 33 Test3 x222 
PAN  2201 2017-01-23 11:00 44 Test4 x222 

meine Abfrage dies so weit ist. Aber natürlich, mit diesem bekam ich nur die letzte Aufzeichnung einer ID, nicht von allen, die die WHERE-Klausel entsprechen

SELECT TOP 1 A.Ereignis, A.tnr, A.date, A.time, A.knr, A.maschnr, B.name 
FROM event_ap AS A 
JOIN pers_stm AS B on A.knr = B.knr 
WHERE A.knr = '11' AND A.date = CONVERT(DATETIME, '23.01.2017') ORDER BY A.time DESC 

Sie für Ihre Antworten danken

+0

weil der Datensatz wurde am 2017-01-22 gemacht, bin ich nur auf der Suche nach Werten vom 23.01.2017 das ist 2017-01-23 –

+0

ist es Logik, die gewährleistet, dass (knr, Datum, Zeit) 'ist einzigartig, oder muss Ihre Abfrageausgabe zwei" letzte "Datensätze mit übereinstimmenden Werten berücksichtigen? –

+0

warten Sie, benötigen Sie die maximale Datum-Zeit oder nur die maximale Zeit für ein bestimmtes Datum dann? –

Antwort

1

Sie können die letzten Datensätze mit dieser bekommen:

select * From (
    select * from 
    (
     select *, row_number() over (partition by knr order by date desc, time desc) as RN 
     from event_ap 
    ) X 
    where RN = 1 
) Y join pers_stm p pn p.knr = Y.knr 
0

Analytische row_number Funktion kann dafür verwendet werden.

SELECT * 
FROM 
    (SELECT *, 
    row_number() over (partition BY knr order by TIME DESC) AS RN 
    FROM event_ap 
    WHERE DATE = '2017-01-23' 
) t 
WHERE rn = 1; 

Dies setzt voraus, dass die TIME Säulen vom Typ time. Wenn nicht, verwenden Sie CONVERT(time ,timecolumn)

Verwandte Themen