Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为ID列表选择最新条目_Sql_Hibernate_Postgresql_Jpa - Fatal编程技术网

Sql 为ID列表选择最新条目

Sql 为ID列表选择最新条目,sql,hibernate,postgresql,jpa,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 ); 我还有一个设备ID列表。此列表中的每个deviceId在MyData中都有一组具有不同注册时间戳的条目 我需要的是使用JPA查询从具有最新时间戳的条目中获取每个devi

我有一张下表:

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

  someData int,

  -- a bunch of other stuff
);
我还有一个设备ID列表。此列表中的每个deviceId在MyData中都有一组具有不同注册时间戳的条目

我需要的是使用JPA查询从具有最新时间戳的条目中获取每个deviceId的一些数据

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


添加.setMaxResults1,为所有设备ID循环它。如何将其放入单个查询中?

在查询中,将其添加到select语句MAXregistered中。因此,它将选择最新注册的时间戳

例如:

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

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

例如:

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

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

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中的字段。

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

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中包含/排除字段。

这将为您获取所有具有最新注册值的设备ID的行

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;
如果为同一设备ID注册的最大值超过一个,则每个设备将获得多行。如果您不想这样做,可以使用:

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;

这将获得具有最新注册值的所有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;
如果为同一设备ID注册的最大值超过一个,则每个设备将获得多行。如果您不想这样做,可以使用:

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;

来吧,伙计,结束这句话-悬念要了我的命@Raad抱歉,没有悬念:-]您可以从MyData d中选择d.someData,其中d.deviceID在通过注册描述从MyData d2顺序中选择DISTINCT d2.deviceID,或者从MyData d中选择d.someData,其中d.deviceID=:dev_id ORDER BY registered DESC LIMIT 1,但不能同时选择两者-您需要循环该.C'mon dude,完成这句话-悬念快把我累死了@Raad抱歉,没有悬念:-]您可以从MyData d中选择d.someData,其中d.deviceID按registered DESC从MyData d2中选择DISTINCT d2.deviceID,或者从MyData d中选择d.someData,其中d.deviceID=:dev_id ORDER BY registered DESC LIMIT 1,但不能同时选择两者-您需要对此进行循环。好的,但这意味着在所有ID上循环-这正是我想要避免的。好吧,但这意味着在所有ID上循环-这正是我想要避免的。