从 table 中获取最新一列,按 HQL 中的另一列分组
Get latest of a column from table, grouped by another column in HQL
我费了好大的劲才想出 HQL 语句。我正在尝试获取一组中所有产品订单的最新状态,但似乎无法找出正确的 HQL 语法来使其正常工作...
示例table:
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。应该导致此 table:
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 的一个值可能有两个 "latest" 记录具有相同的 created_at
值),则需要更深层次的子查询——下面的 HQL 将只选择一个最高 created_at
的记录,然后为每个 purchase_id
选择最高 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
)
我费了好大的劲才想出 HQL 语句。我正在尝试获取一组中所有产品订单的最新状态,但似乎无法找出正确的 HQL 语法来使其正常工作...
示例table:
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。应该导致此 table:
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 的一个值可能有两个 "latest" 记录具有相同的 created_at
值),则需要更深层次的子查询——下面的 HQL 将只选择一个最高 created_at
的记录,然后为每个 purchase_id
选择最高 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
)