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上循环-这正是我想要避免的。