1

我有一个下表:

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

  someData int,

  -- a bunch of other stuff
);

我也有一个deviceIDs 列表。此列表中的每个deviceId条目都有一堆MyData具有不同registered时间戳的条目。

我需要的是从具有最新使用 JPA 查询的条目中获取someData每个条目。deviceIdtimestamp

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

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

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

4

3 回答 3

1

这将为您deviceid提供具有最新“注册”值的所有 s的行

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则每个设备都会得到不止一行。如果你不想这样,你可以使用:

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;
于 2013-02-15T09:34:23.680 回答
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 中包含/排除字段。

于 2013-02-15T06:30:35.040 回答
0

在您的查询中,添加到 select 语句MAX(registered)。因此,它将选择最新注册的时间戳

例子:

SELECT d.someData, MAX(registered) from MyData d WHERE d.deviceID =:dev_id
于 2013-02-13T16:25:31.207 回答