Последняя запись той же группы

Я думаю, что есть похожие вопросы, но ни один из них не соответствует моему случаю. Я попробовал левое внешнее соединение, чтобы получить последний статус, но тогда я не могу получить последнюю запись на основе группировки родительских идентификаторов.

У меня есть следующие таблицы

Таблица документов

идентификатор название версии parnet_id1 parent_id2 отметка времени UUI1 А 1 100 отметка времени1 UUI2 Б 1 100 временная метка2 UUI3 С 2 100 отметка времени3 UUI4 Д 2 100 отметка времени4 UUI5 Е 2 100 отметка времени5

Таблица истории документа

document_id положение дел отметка времени UUI1 Активный отметка времени1 UUI1 Неактивный временная метка2 UUI2 Неактивный отметка времени3 UUI2 Активный отметка времени4 UUI3 Неактивный отметка времени3 UUI3 Активный отметка времени4 UUI4 Неактивный отметка времени3 UUI4 Активный отметка времени4 UUI5 Активный отметка времени3 UUI5 Неактивный отметка времени4

Какой запрос дает мне следующую таблицу (группа с parent_id1 и parent_id2)

Таким образом, документы с одинаковым parent_id1 и parent_id2 являются разными версиями одного и того же документа, поэтому нас интересует только последняя версия на основе метки времени. Нам также нужен их последний статус из таблицы истории на основе метки времени (один ко многим)

идентификатор название версии parnet_id1 parent_id2 отметка времени положение дел UUI2 Б 1 100 временная метка2 Активный UUI5 Е 2 100 отметка времени5 Неактивный

Я очень не понимаю, что означают ваши образцы данных и что вы пытаетесь сделать. Должна ли отметка времени5 появляться где-то в таблице истории документов? Может быть, вы можете показать нам запрос, который вы пробовали, и результаты, которые он дал, а затем указать, чем отличаются ваши желаемые результаты.

Stewart Macdonald 06.02.2023 09:29

О, извините, что ввел вас в заблуждение, временные метки — это просто время вставки, поэтому в основном они получены из функции «сейчас ()», я проиндексировал их, чтобы показать, какой из них старше, а какой раньше.

ehsun7b 06.02.2023 09:37

Ради демонстрации

ehsun7b 06.02.2023 09:38

Мне нужно больше произвольных полей, чтобы они были в конечном результате, я пытался добавить поле под названием address в демо, у меня не получилось, можете посмотреть? или ответ здесь. пс. Игнорируйте этот комментарий. У меня работает с дополнительными полями. Позвольте мне попробовать это на моей реальной проблеме и вернуться сюда. Спасибо

ehsun7b 06.02.2023 10:25

Это на 99% то, что я хочу, за исключением того, что статус не является последней записью в таблице историй. Думаю проблема именно в этой части as h3 on h2.document_id = h3.id and h3.created = h2.created .

ehsun7b 06.02.2023 10:42

Должна быть какая-то логика, которая гарантирует, что мы получим статус из самой последней вставленной записи этой группы из таблицы document_histories, верно?

ehsun7b 06.02.2023 10:43

О, подождите, я думаю, это правильно. Спасибо

ehsun7b 06.02.2023 10:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя 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

Демо здесь

Другие вопросы по теме