Sql Query, чтобы получить запись, которая имеет максимальный номер идентификатора для каждого типа - PullRequest
3 голосов
/ 14 июня 2011

У меня есть таблица в SQL Server. Он имеет поле pid, используемое в качестве первичного ключа, и поле с именем deviceid, которое имеет имя устройства. Пример:

pid  deviceid   field3 field4
1    Device1    test    test
2    Device2    test2   test2
3    Device1    test3   test3
4    Device2    test4   test4

Для запроса мне нужно выбрать * из таблицы, где pid - это максимум на устройство. Пример результата:

pid  deviceid   field3  field4
3    Device1    test3   test3
4    Device2    test4   test4

Я не уверен, как это сделать. У кого-нибудь есть идеи?

Самое близкое, что у меня было:

Select MAX(pid) from TheTable Group By deviceid;

Это работает, но это дает мне максимальный pid на устройство в результатах, и мне нужно все поля для этой записи. Добавление других полей в предложение select привело к ошибкам, указав, что поля должны быть перечислены в предложении group by ... Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

3 голосов
/ 14 июня 2011
select *
from (
       select *,
              row_number() over(partition by deviceid order by pid desc) as rn
       from TheTable
     ) as T
where rn = 1
3 голосов
/ 14 июня 2011

Вы были очень близки ... просто нужно дополнительное объединение, чтобы получить остальные результаты.

SELECT t.*
FROM
   TheTable t JOIN
   (
      Select MAX(pid) AS MAXpid 
      from TheTable 
      Group By deviceid
   ) maxt on maxt.MAXpid = t.pid
2 голосов
/ 14 июня 2011
select * from TheTable t where pid=(select top 1 pid from TheTable
  where deviceid=t.deviceid order by pid desc)

Используя select top 1 pid в подвыборке, вы можете выбрать любое предложение порядка, которое вам нравится, чтобы решить, какую 1 строку вернуть для каждого идентификатора устройства.Подобный синтаксис хорошо работает в соединении:

select r.deviceid, r.otherinfo, t.* from RelatedTable r
join TheTable t on t.pid=(select top 1 pid from TheTable
   where deviceid=r.deviceid order by pid desc)
...