0

У меня есть table, как показано ниже -выберите Top N записей для каждого объекта


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 

Теперь, я хочу top 1row, основанный на date column для каждого device_ID

Ожидаемый выход


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

Я использую SQL Server 2008 R2. я могу пойти и написать Stored Procedure, чтобы обработать его, но хотел сделать это с простым запросом.

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

ответа на этот вопрос «Феликса Pamittan» работала хорошо, но для «N» просто изменить его

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 

Он упомянул об этом в комментарии думали, чтобы добавить его вопросы так, что ни один орган не пропустите его.

+0

Вы можете использовать 'Group By' вместе с' MAX', чтобы получить то, что вы хотите –

ответ

6

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

Почему бы не использовать 'Group By' и 'MAX'. Любая конкретная причина? –

+0

@CoderofCode Поскольку OP нуждается в 'Id' –

+0

, что здесь 't'? –

0

Если вы не можете использовать аналитическую функцию, например, потому что ваш слой приложение не позволит, то вы можете попробовать следующее решение, которое использует подзапрос, чтобы прийти к ответу:

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

Вы можете также попробовать использовать CTE

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) 

должен сделать трюк, предположим, что «верхняя 1 строка на основе столбца даты» означает, что вы хотите выбрать самую последнюю отчетную дату каждого Device_ID?

Что касается вашего заголовка, выберите верхние 5 строк каждого 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 

даст вам топ-5 последних сообщений каждого идентификатора устройства. Вы можете отсортировать верхнюю 5-ю дату, если ваши данные не в порядке ...