1

次の表があります。

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

  someData int,

  -- a bunch of other stuff
);

sのリストもありますdeviceID。このリストのそれぞれには、異なるタイムスタンプを持つdeviceId一連のエントリがあります。MyDataregistered

私が必要とするのは、 JPA クエリを使用して最新のエントリからsomeDataそれぞれを取得することです。deviceIdtimestamp

もちろん、次のdeviceIdように、単一の に必要なデータを取得するクエリを作成できます。

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

を追加.setMaxResults(1)し、すべての s に対してループしdeviceIDます。それを単一のクエリに入れるにはどうすればよいですか?

4

3 に答える 3

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に対して複数の "max" 値がある場合registered、各デバイスに対して複数の行が取得されます。それを望まない場合は、次を使用できます。

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;
于 2013-02-15T09:34:23.680 に答える
0

クエリで、selectステートメントに追加しますMAX(registered)。したがって、登録されている最新のタイムスタンプが選択されます

例:

SELECT d.someData, MAX(registered) from MyData d WHERE d.deviceID =:dev_id
于 2013-02-13T16:25:31.207 に答える
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 にフィールドを含める/除外するようにクエリを変更します。

于 2013-02-15T06:30:35.040 に答える