2016-11-20 8 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 

Получите последние (по created_at) каждого purchase_id, где 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 

Query, который работает в 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 будет выбирать только одну запись с самым высоким , а затем самым высоким id за каждые purchase_id (на этот раз assumming этот идентификатор является первичным ключом и уникально):

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, но мне просто нужно было добавить 'AND o.group_id =?' После предложения WHERE ... IN() ', чтобы все работало! – justderb