2013-02-13 85 views
1

我有如下表ID列表:选择最新的条目

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

    someData int, 

    -- a bunch of other stuff 
); 

我也有deviceID的List。来自此列表的每个deviceIdMyData中有一堆条目,它们具有不同的registered时间戳。

我需要的是使用JPA查询从具有最新timestamp的条目获得每个deviceIdsomeData

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

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

加入.setMaxResults(1),环路,所有deviceID秒。我如何将它放入单个查询中?

+1

来吧伙计,完成句子 - 悬念正在杀了我! – Raad 2013-02-13 16:17:10

+0

@Raad对不起,暂无意思: - ] – Andy 2013-02-13 16:18:45

+1

你可以'从SELECT选择d.someData d WHERE d.deviceID(从SELECT选择DISTINCT d2.deviceID从MyData d2)ORDER BY注册DESC'或'SELECT d.someData from MyData d WHERE d.deviceID =:dev_id ORDER BY注册DESC LIMIT 1'但不能同时存在 - 您需要为此循环。 – Raad 2013-02-13 16:23:47

回答

0

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

例如:

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

好吧,但这意味着循环所有的ID - 这正是我想要避免的。 – Andy 2013-02-13 17:30:43

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

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; 

如果有一个以上的“最大”为registered为同一设备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;