Как выбрать максимальную дату с другими столбцами, сгруппированными только по одному определенному столбцу

#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') .