选择最新条目以获取ID列表

时间:2013-02-13 16:15:19

标签: sql hibernate postgresql jpa

我有一张桌子:

create table MyData
(
  id bigserial primary key,
  registered timestamp not null,
  deviceID int not null,

  someData int,

  -- a bunch of other stuff
);

我还有deviceID的列表。此列表中的每个deviceIdMyData中都有一堆具有不同registered时间戳的条目。

我需要的是从使用JPA查询的最新someData的条目中为每个deviceId获取timestamp

当然,我可以编写一个查询来获取单个deviceId所需的数据,例如

SELECT d.someData from MyData d WHERE d.deviceID =:dev_id ORDER BY registered DESC

添加.setMaxResults(1),为所有deviceID循环播放。如何将其放入单个查询中?

3 个答案:

答案 0 :(得分:1)

这将为您提供具有最新“已注册”值

的所有deviceid的行
select id, 
       deviceid,
       somedata,
       registered
from (
   select id,
          deviceid,
          somedata,
          registered,
          max(registered) over (partition by deviceid) as max_registered
   from myData
) t
where registered = max_registered
order by deviceid;

如果同一deviceId的registered有多个“max”值,则每个设备都会有多行。如果您不想这样,可以使用:

select id, 
       deviceid,
       somedata,
       registered
from (
   select id,
          deviceid,
          somedata,
          registered,
          row_number() over (partition by deviceid order by registered desc) as rn
   from myData
) t
where rn = 1
order by deviceid;

答案 1 :(得分:0)

在查询中

,添加到select语句MAX(registered)。因此,它将选择最新的时间戳记

示例:

SELECT d.someData, MAX(registered) from MyData d WHERE d.deviceID =:dev_id

答案 2 :(得分:0)

您可以尝试以下查询,该查询将为具有最大注册时间戳的每个设备获取数据。

SELECT d.deviceID, 
       min(d.someData) 
FROM MyData d 
WHERE d.registered IN (Select MAX(m.registered) 
                       from MyData m 
                       where m.deviceID = d.deviceID) 
group by d.deviceID;

更改查询以在select,group-by中包含/排除字段。