微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

标准 API 谓词:在一个列上分组,在另一列上找到第 min 行,然后返回第三个

如何解决标准 API 谓词:在一个列上分组,在另一列上找到第 min 行,然后返回第三个

我有桌子

CREATE TABLE stp2_vehicles.can_data (
    id bigserial NOT NULL,receive_time timestamp NOT NULL,gps_frame_id int8 NULL
);

基于它,我需要添加更大查询所需的条件谓词。 我需要在 clausule 中选择返回 can_data 的 id - 每个 gps 帧只有一个 id,即具有最早时间戳的那个。

所以在 sql 中它看起来像这样:

select cd.id 
from stp2_vehicles.can_data cd
right join
        (select gps_frame_id,min(receive_time) as min_time
        from stp2_vehicles.can_data
        group by gps_frame_id
        ) cd2 on cd.gps_frame_id = cd2.gps_frame_id and cd.receive_time = cd2.min_time
;

不幸的是,标准 API 不支持加入子查询的结果。

我也尝试过使用 self join 的方法(应该由标准 api 支持),但我提供的解决方案似乎计算过于复杂或有我看不到的错误

select cd.id
from stp2_vehicles.can_data cd
inner join stp2_vehicles.can_data cd2 on cd.id=cd2.id
where cd.receive_time = (select min(receive_time) from stp2_vehicles.can_data cd3 where cd.gps_frame_id = cd3.gps_frame_id );

顺便说一句: 我设法解决了更简单的情况:

select min(cd.id) from can_data cd group by cd.gps_frame_id
CriteriaQuery<CANData> criteriaQueryCanData = cb.createquery(CANData.class);
Subquery<Long> subquery = criteriaQueryCanData.subquery(Long.class);
Root<CANData> canDataSubroot = subquery.from(CANData.class);
subquery
    .select(cb.least(canDataSubroot.<Long>get(CANData_.ID)))
    .groupBy(canDataSubroot.<Long>get(CANData_.GPS_FRAME));

解决方法

由于子查询似乎是“静态的”,您可以使用 @Subselect 注释为子查询的结果定义一个实体。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。