【问题标题】:Select latest entries for a list of IDs选择 ID 列表的最新条目
【发布时间】:2013-02-13 16:15:18
【问题描述】:

我有一个下表:

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

  someData int,

  -- a bunch of other stuff
);

我还有deviceIDs 的列表。此列表中的每个deviceIdMyData 中都有一堆具有不同registered 时间戳的条目。

我需要的是使用 JPA 查询从具有最新 timestamp 的条目中为每个 deviceId 获取 someData

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

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

添加.setMaxResults(1),为所有deviceIDs 循环。如何将其放入单个查询中?

【问题讨论】:

  • 来吧,老兄,把这句话说完——悬念要了我的命!
  • @Raad 抱歉,没有悬念:-]
  • 您可以 SELECT d.someData from MyData d WHERE d.deviceID in (SELECT DISTINCT d2.deviceID from MyData d2) ORDER BY registered DESCSELECT d.someData from MyData d WHERE d.deviceID = :dev_id ORDER BY registered DESC LIMIT 1 但不能同时使用 - 您需要为此循环。

标签: sql hibernate postgresql jpa


【解决方案1】:

这将为您提供具有最新“注册”值的所有 deviceids 的行

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 存在多个“最大值”值,则每个设备都会获得不止一行。如果你不想这样,你可以使用:

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;

【讨论】:

    【解决方案2】:

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

    示例:

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

    【讨论】:

    • 好的,但这意味着循环遍历所有 id - 这正是我想要避免的。
    【解决方案3】:

    您可以尝试以下查询,该查询将为每个具有最大注册时间戳的设备获取数据。

    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;
    

    更改查询以在选择中包含/排除字段,相应地分组。

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2019-01-17
      • 2015-04-17
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2012-03-17
      • 2011-11-10
      • 2023-04-06
      相关资源
      最近更新 更多