Sql Query获取记录具有每种类型的最大ID号的记录

时间:2011-06-14 03:00:58

标签: sql sql-server-2008-r2 greatest-n-per-group

我在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 个答案:

答案 0 :(得分:3)

你非常接近......只需要一个额外的联接来获得剩下的结果。

SELECT t.*
FROM
   TheTable t JOIN
   (
      Select MAX(pid) AS MAXpid 
      from TheTable 
      Group By deviceid
   ) maxt on maxt.MAXpid = t.pid

答案 1 :(得分:3)

select *
from (
       select *,
              row_number() over(partition by deviceid order by pid desc) as rn
       from TheTable
     ) as T
where rn = 1

答案 2 :(得分:2)

select * from TheTable t where pid=(select top 1 pid from TheTable
  where deviceid=t.deviceid order by pid desc)

通过在子选择中使用select top 1 pid,您可以选择任何您喜欢的订单子句,以决定为每个deviceid返回哪一行。类似的语法在连接中很有效:

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)