【问题标题】:Select row with group by and max in JPQL在 JPQL 中选择具有分组依据和最大值的行
【发布时间】:2017-10-18 06:02:31
【问题描述】:

我有以下结构。不在一张桌子上,只是为了简单起见:

Press       | Batch        | Start time
-------------------------------------------------
PRESS_1     | 2051         | 2017-05-18T00:00:00
PRESS_1     | 2052         | 2017-05-19T00:00:00
PRESS_2     | 2053         | 2017-05-20T00:00:00
PRESS_2     | 2054         | 2017-05-16T00:00:00
PRESS_3     | 2055         | 2017-05-12T00:00:00
PRESS_3     | 2056         | 2017-05-18T00:00:00
PRESS_3     | 2057         | 2017-05-19T00:00:00

我想获得每台印刷机的最后一个计划批次。结果应该是:

Press       | Batch        | Start time
-------------------------------------------------
PRESS_1     | 2052         | 2017-05-19T00:00:00
PRESS_2     | 2053         | 2017-05-20T00:00:00
PRESS_3     | 2057         | 2017-05-19T00:00:00

但是,当我按新闻分组并且还想选择批次时。我有义务将批次放入“Group By”条款。

Select x.Press, x.Batch, max(x.StartTime)
From myTable x
Group by x.Press

如何使用 JPQL 实现这一点?

【问题讨论】:

  • @Veljko89 正如您在 PRESS_2 中看到的,情况并非总是如此。
  • 这个问题已经在 SO 中被多次回答。请在发布问题之前尝试做一些研究。
  • @GiorgosBetsos 很难找到合适的词来谷歌这个。但是请保持帖子打开,因为这认为 JPQL 比您引用的重复帖子更受限制。此外,这种特殊情况的原理也不一样。
  • @GiorgosBetsos 请检查。我已经编辑了问题。
  • 我认为您在帖子的原始版本中还提到了 SQL 解决方案。没关系,我会投票支持重新提出问题。

标签: sql jpql


【解决方案1】:

由于您想选择每次按下的最大开始时间的条目,您也可以使用下面提到的内容 -

Select x.Press, x.Batch, x.StartTime
From x 
where (press,starttime) in 
(select press, max(starttime) 
from x group by press)

让我们试一试,请告诉我。

【讨论】:

    【解决方案2】:

    您可以使用内部联接与聚合结果进行分组

    select * from my_table as t1
    inner join  (
    select Press, max(start_time) my_time
    from my_table 
    group by Press ) t2 on t1.Press = T2.Press and t2.my_time = t1.start_time
    

    或避免加入

    select * from my_table as t1
    where (t1.Press, t1.start_time) in (
    select Press, max(start_time) 
    from my_table 
    group by Press ) 
    

    或者如果你的 ORM 是有限的,你可以创建一个适当的视图,然后使用视图名称作为表来避免子查询

    【讨论】:

    • 很遗憾,JPQL 中不允许在连接类中使用子查询
    • 是否允许使用元组..?无论如何,用元组更新答案
    • 显然也没有元组 :( 它非常有限,因为它不是原生的。
    • 批号与start_time一致? .. 几乎在同一个媒体上?
    • 如果您的 ORM 框架受到限制,我已经更新了答案,并添加了一个简单的建议..
    【解决方案3】:

    假设您的批次随着每次开始时间而增加,您也应该能够从批次中获得最大值:

    Select x.Press, max(x.Batch), max(x.StartTime)
    From x
    Group by x.Press
    

    【讨论】:

    • 这行不通。对于 press 2,它将返回:PRESS_2, 2054, 2017-05-20。所以批次不正确。
    猜你喜欢
    • 2015-11-10
    • 2019-01-06
    • 2012-05-18
    • 2022-11-20
    • 1970-01-01
    • 2015-08-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多