0

Ich habe ein table wie unten -Top-N Datensätze wählen für jede Entität


ID | Reported Date     | Device_ID 
------------------------------------------- 
1 | 2016-03-09 09:08:32.827   | 1 
2 | 2016-03-08 09:08:32.827   | 1 
3 | 2016-03-08 09:08:32.827   | 1 
4 | 2016-03-10 09:08:32.827   | 2 
5 | 2016-03-05 09:08:32.827   | 2 

Jetzt möchte ich eine top 1row basierend auf date column für jede device_ID

Erwartete Ausgabe


ID | Reported Date     | Device_ID 
------------------------------------------- 
1 | 2016-03-09 09:08:32.827   | 1 
4 | 2016-03-10 09:08:32.827   | 2 

Ich verwende SQL Server 2008 R2. Ich kann gehen und Stored Procedure schreiben, um es zu handhaben, aber wollte es mit einfacher Abfrage tun.

**************** EDIT **************************

Antwort von ‚Felix Pamittan‘ hat gut funktioniert, aber für ‚N‘ es nur zu

SELECT 
    Id, [Reported Date], Device_ID 
FROM (
    SELECT *, 
     Rn = ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [ReportedDate] DESC) 
    FROM tbl 
)t 
WHERE Rn >= N 

ändert Er gedacht in Kommentar erwähnt hatte, es zu Fragen hinzufügen, so dass kein Körper es verpassen.

+0

Sie können 'Group By' zusammen mit' MAX' verwenden, um zu bekommen, was Sie wollen –

Antwort

6

Verwendung ROW_NUMBER:

SELECT 
    Id, [Reported Date], Device_ID 
FROM (
    SELECT *, 
     Rn = ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [ReportedDate] DESC) 
    FROM tbl 
)t 
WHERE Rn = 1 
+0

Warum nicht 'Group By' verwenden und 'MAX'. Irgend ein bestimmter Grund ? –

+0

@CoderofCode Weil das OP die 'Id' benötigt –

+0

was ist 't' hier? –

0

Wenn Sie nicht eine analytische Funktion verwenden können, beispielsweise weil Ihre Anwendungsschicht es nicht zulassen, dann können Sie die folgende Lösung versuchen, die eine Unterabfrage in der Antwort zu gelangen verwendet:

SELECT t1.ID, t2.maxDate, t1.Device_ID 
INNER JOIN 
(
    SELECT Device_ID, MAX([Reported Date]) AS maxDate 
    FROM yourTable 
    GROUP BY Device_ID 
) t2 
    ON t1.Device_ID = t2.Device_ID AND t1.[Reported Date] = t2.maxDate 
0

können Sie auch

With DeviceCTE AS 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [Reported Date] DESC) AS Num 
FROM tblname) 
SELECT Id, [Reported Date], Device_ID 
From DeviceCTE 
Where Num = 1 
0
Select * from DEVICE_TABLE D 
where [Reported Date] = (Select Max([Reported Date]) from DEVICE_TABLE where Device_ID = D.Device_ID) 

mit CTE versuchen sollten Sie den Trick machen, davon ausgehen, dass "oberste 1 Zeile basierend auf Datum Spalte" bedeutet, dass Sie das neueste berichtete Datum für jede Device_ID auswählen möchten?

Wie für Ihren Titel, wählen Sie Top-5-Reihen von jeweils DEVICE_ID

Select * from DEVICE_TABLE D 
where [Reported Date] in (Select top 5 [Reported Date] from DEVICE_TABLE D where Device_ID = D.Device_ID) 
order by Device_ID, [Reported Date] desc 

finden Sie die Top-5 neuesten Berichte der einzelnen Geräte-ID geben. Sie möchten vielleicht die Top 5 Datum sortieren, wenn Ihre Daten nicht in Ordnung sind ...