java - 从表中获取最新的列,并按 HQL 中的另一列进行分组

标签 java postgresql hql

我在尝试找出 HQL 语句时遇到了麻烦。我正在尝试获取组内所有产品订单的最新状态,但似乎无法找出正确的 HQL 语法来使其正常工作...

示例表:

id | created_at | group_id | purchase_id | status
---|------------|----------|-------------|------------
0  | 10         | 3        | 6           | DELIVERING
1  | 11         | 3        | 6           | DELIVERED
2  | 12         | 3        | 7           | DELIVERING
3  | 13         | 3        | 8           | DELIVERING
4  | 14         | 4        | 13          | DELIVERING
5  | 15         | 4        | 13          | DELIVERED
6  | 16         | 4        | 13          | LOST
7  | 17         | 5        | 17          | DELIVERING

获取每个 purchase_id 的最新(由 created_at),其中 group_id = 3。应生成此表:

id | created_at | group_id | purchase_id | status
---|------------|----------|-------------|------------
1  | 11         | 3        | 6           | DELIVERED
2  | 12         | 3        | 7           | DELIVERING
3  | 13         | 3        | 8           | DELIVERING

在 PostgreSQL 中运行的查询:

SELECT DISTINCT ON (o.purchase_id) *
FROM orders o
WHERE o.group_id = 3
ORDER BY o.purchase_id, o.created_at DESC

等效的 HQL 语句是什么?

最佳答案

假设 created_at 值在每个 purchase_id 中都是唯一的,那么下面的 HQL 应该可以工作

from Orders
WHERE (purchase_id, created_at) 
      IN  
      (   SELECT purchase_id, max( created_at ) 
          FROM Orders
          GROUP BY purchase_id 
      )

created_at 对于给定的 purchase_id 不唯一时(一个purchase_id 值可能有两条具有相同 created_at 值的“最新”记录>),那么需要更深层次的子查询 - 下面的 HQL 将仅选择一条具有最高 created_at 和每个 purchase_id 最高 id 的记录>(这次假设ID是主键并且是唯一的):

from Orders
WHERE id IN (
   SELECT max( id ) from Orders
   WHERE (purchase_id, created_at) 
         IN  ( 
           SELECT purchase_id, max( created_at ) 
           FROM Orders
           GROUP BY purchase_id 
          )
   GROUP BY purchase_id
 )

关于java - 从表中获取最新的列,并按 HQL 中的另一列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699854/

相关文章:

java - 如何将变量从 php 文件传递​​到 Android Activity ?

postgresql - 如何使用柴油进行 IN 查询?

java - 尝试使用 Hibernate HQL 返回一组对象时抛出异常

sql - 使用 Postgres 时为 "Operator does not exist: integer =?"

java - 使用实体多对多定义的 Hibernate HQL 投影问题

java - HQL 按日期查询(Java+NetBeans)

java - 在 OSX 上安装 Play 框架时出现问题

java - 确保 Oracle 数据库表列中的字符串不超过 2000 字节

Java 8 Streams : multiple filters vs. 复杂情况

c# - ASP.net C# 中的动态警告框