我在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子句中列出...任何人都知道如何执行此操作?
答案 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)