2013-02-13 103 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;