我有一张桌子:
create table MyData
(
id bigserial primary key,
registered timestamp not null,
deviceID int not null,
someData int,
-- a bunch of other stuff
);
我还有deviceID
的列表。此列表中的每个deviceId
在MyData
中都有一堆具有不同registered
时间戳的条目。
我需要的是从使用JPA查询的最新someData
的条目中为每个deviceId
获取timestamp
。
当然,我可以编写一个查询来获取单个deviceId
所需的数据,例如
SELECT d.someData from MyData d WHERE d.deviceID =:dev_id ORDER BY registered DESC
添加.setMaxResults(1)
,为所有deviceID
循环播放。如何将其放入单个查询中?
答案 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中包含/排除字段。