Я думаю, что есть похожие вопросы, но ни один из них не соответствует моему случаю. Я попробовал левое внешнее соединение, чтобы получить последний статус, но тогда я не могу получить последнюю запись на основе группировки родительских идентификаторов.
У меня есть следующие таблицы
Таблица документов
Таблица истории документа
Какой запрос дает мне следующую таблицу (группа с parent_id1 и parent_id2)
Таким образом, документы с одинаковым parent_id1 и parent_id2 являются разными версиями одного и того же документа, поэтому нас интересует только последняя версия на основе метки времени. Нам также нужен их последний статус из таблицы истории на основе метки времени (один ко многим)
О, извините, что ввел вас в заблуждение, временные метки — это просто время вставки, поэтому в основном они получены из функции «сейчас ()», я проиндексировал их, чтобы показать, какой из них старше, а какой раньше.
Ради демонстрации
Мне нужно больше произвольных полей, чтобы они были в конечном результате, я пытался добавить поле под названием address
в демо, у меня не получилось, можете посмотреть? или ответ здесь. пс. Игнорируйте этот комментарий. У меня работает с дополнительными полями. Позвольте мне попробовать это на моей реальной проблеме и вернуться сюда. Спасибо
Это на 99% то, что я хочу, за исключением того, что статус не является последней записью в таблице историй. Думаю проблема именно в этой части as h3 on h2.document_id = h3.id and h3.created = h2.created
.
Должна быть какая-то логика, которая гарантирует, что мы получим статус из самой последней вставленной записи этой группы из таблицы document_histories
, верно?
О, подождите, я думаю, это правильно. Спасибо
Используя inner join
и group by
, мы можем сделать это следующим образом:
select h3.*, h2.status
from history h2
inner join (
select t.id, t.version_name, t.parnet_id1, t.parent_id2, max(h.timestamp) as timestamp
from history h
inner join (
select d.id, d.version_name, d.parnet_id1, d.parent_id2
from document d
inner join (
select parnet_id1, parent_id2, max(timestamp) as timestamp
from document
group by parnet_id1, parent_id2
) as s on s.parnet_id1 = d.parnet_id1 and s.parent_id2 = d.parent_id2 and s.timestamp = d.timestamp
) t on t.id = h.document_id
group by t.id, t.version_name, t.parnet_id1, t.parent_id2
) as h3 on h2.document_id = h3.id and h3.timestamp = h2.timestamp
Я очень не понимаю, что означают ваши образцы данных и что вы пытаетесь сделать. Должна ли отметка времени5 появляться где-то в таблице истории документов? Может быть, вы можете показать нам запрос, который вы пробовали, и результаты, которые он дал, а затем указать, чем отличаются ваши желаемые результаты.