2016-11-20 66 views
2

我有一段時間試圖找出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,其中group_id = 3.如果導致這個表格的最新(由created_at):

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語句是什麼?

回答

1

Assumming是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然後最高的id每個purchase_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 
) 
+0

對不起,但我沒有看到這是如何得到最新的每個'purchase_id'分組?我看到你使用的是最新的'created_at'值(或者最高的'id'),但是看不到'purchase_id'仍然是如何分組的。 – justderb

+0

我已經更新了答案。 – krokodilko

+0

謝謝!我已經使用了第一個HQL語句,但只需要在WHERE ... IN()子句之後添加AND AND.Group_id =?來讓所有的東西都能正常工作! – justderb

相關問題