#mysql #group-by #jooq
Вопрос:
Я хочу выбрать последнего получателя для каждого заказа раньше PRODUCTION_TASK_COMPLETED
(или текущего, если производственная задача не завершена).
Я не могу найти способ получить последнего получателя. Как только правопреемник изменится, так как я должен поместить в group by
предложение все столбцы, которые не агрегированы.
Вот что-то похожее на то, что я хочу в MySQL (мне это нужно в jooq, но я перепишу это позже)
SELECT
t_user.first_name,
t_user.last_name,
assigneehistory1.order_id,
MAX(assigneehistory1.entry_date)
FROM
t_entity_history_entry AS assigneehistory1
LEFT OUTER JOIN
t_user ON t_user.id = assigneehistory1.assignee_id
WHERE
(assigneehistory1.entry_type = 'ORDER_ASSIGNED'
AND assigneehistory1.entry_date <= COALESCE((SELECT
MAX(assigneehistory2.entry_date)
FROM
t_entity_history_entry AS assigneehistory2
WHERE
(assigneehistory2.entry_type = 'PRODUCTION_TASK_COMPLETED'
AND assigneehistory2.order_id = assigneehistory1.order_id)),
NOW()))
GROUP BY t_user.first_name , t_user.last_name , assigneehistory1.order_id
Но, как я уже сказал, это возвращает несколько строк для одного и того же заказа для каждого другого получателя, в то время как мне просто нужна последняя.
Комментарии:
1. Если вы хотите иметь по одной строке для каждой отдельной
order_id
независимо от значений в других столбцах, вы должны группироваться только по этому столбцу, а не по 3 столбцам. Еще 2 столбца должны быть объединены.2. Я не могу объединить два других столбца. Это просто попытка приблизиться к желаемому результату, я знаю, что должен переписать это, чтобы достичь того, чего я хочу, я просто не могу понять, как.
3. Тест
SELECT MAX(t_user.first_name), MAX(t_user.last_name), assigneehistory1.order_id, MAX(assigneehistory1.entry_date) FROM ... GROUP BY assigneehistory1.order_id
. Для вашего скриншота он вернется('Super', 'User', 3, '2021-08-16 16:44:49')
.