В сгруппированной таблице, как выбрать идентификатор строки, которая имеет MAX (метка времени) в группе?

CREATE TABLE account (
  account_id VARCHAR(36) NOT NULL PRIMARY KEY, -- uuid
  account_name VARCHAR(255) NOT NULL
);

CREATE TABLE `transaction` (
  transaction_id VARCHAR(36) NOT NULL PRIMARY KEY, -- uuid
  transaction_timestamp BIGINT NOT NULL,
  account_debit_id VARCHAR(36) NOT NULL,
  account_credit_id VARCHAR(36) NOT NULL,
  transaction_amount DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (account_debit_id) REFERENCES account(account_id),
  FOREIGN KEY (account_credit_id) REFERENCES account(account_id)
);

CREATE TABLE balance_event (
  balance_event_id VARCHAR(36) NOT NULL PRIMARY KEY, -- uuid
  transaction_id VARCHAR(36) NOT NULL,
  account_id VARCHAR(36) NOT NULL,
  account_balance DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (transaction_id) REFERENCES `transaction`(transaction_id),
  FOREIGN KEY (account_id) REFERENCES account(account_id)
);

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

Я хочу описать запрос, который дает мне все строки из таблицы account вместе с соответствующими им account_balance, взятыми из balance_event. Я тестирую код в онлайн-редакторе SQL, который использует MySQL, но я ищу запрос, поддерживаемый PostgreSQL.

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

Какую версию MySQL вы можете использовать? Можно ли использовать MySQL 8.0 или требуется поддержка MySQL 5.x?

Bill Karwin 17.04.2023 23:20
sqlfiddle.com dbfiddle.uk
philipxy 18.04.2023 00:37

Я исправил много дезорганизации, избыточности и шума. Пожалуйста, рассмотрите эти аспекты отредактированного поста. Что касается деталей фразировки, я редактирую так много плохого текста, что удаляю все, что могу, что не нужно, хотя иногда я оставляю обороты фразы. Но я не согласен с тем, что здесь стоит восстанавливать какую-то "особую формулировку". Пожалуйста, не прячьте код в сниппеты, люди должны его прочитать. PS Пожалуйста, задайте вопрос о MySQL или вопрос о PostgreSQL и отредактируйте в соответствии с моими комментариями. (Между тем) Оба дубликата актуальны, вы не привели минимальный воспроизводимый пример, вы просто вывалили неправильный код. Закрепить до 1 выпуска.

philipxy 18.04.2023 13:26

Пожалуйста, не редактируйте таким образом, чтобы сделать недействительными разумные опубликованные ответы. Хотя я не считаю разумными ответы на неясный вопрос, который представляет собой несколько вопросов, которые, как знает ответчик, являются дубликатами много раз. Они беспорядок. PS Meta Stack Overflow Meta Stack Exchange PS Когда люди думают, что им нужно кричать, им почти всегда нужна хорошая организация и фразировка. PS Пожалуйста, избегайте социальных и мета-комментариев в сообщениях.

philipxy 18.04.2023 13:45

@philipxy Я ценю ваш ценный вклад, я добавлю его к моему 8,5-летнему опыту задавать и редактировать вопросы. Что касается «крика», этот прием письма называется «подчеркнуть», и иногда он необходим, если он явно не запрещен. Это как-раз тот случай.

Parzh from Ukraine 18.04.2023 16:30

Я знаю, что это акцент и «им почти всегда нужна» «хорошая организация и формулировка вместо этого», и это имеет место здесь, и поэтому я упомянул об этом. Также теперь в этом посте нет вопроса, вы заменили вопрос на (мета) утверждение. Кроме того, бесполезно говорить, что вы что-то пробовали или исследовали, не сообщая конкретных результатов, имеющих отношение к тому, о чем вы спрашиваете; Я оставил некоторые здесь в своем последнем редактировании, чтобы показать, что в этом посте было больше связанных попыток неправильного кода, каждая из которых должна получить 1 вопрос. Пожалуйста, отреагируйте на остальные мои комментарии. минимальный воспроизводимый пример Также те 2 ссылки, которые я дал, являются дубликатами. Удачи.

philipxy 19.04.2023 01:19
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
9
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот решение, использующее оконные функции, которые долгое время поддерживаются PostgreSQL , MySQL 8.0 и большинством других популярных баз данных SQL, как коммерческих, так и с открытым исходным кодом.

SELECT *
FROM (
  SELECT
    a.*,
    b.account_balance,
    ROW_NUMBER() OVER (PARTITION BY a.account_id ORDER BY t.transaction_timestamp DESC) AS rownum
  FROM account AS a
  JOIN balance_event AS b USING (account_id)
  JOIN transaction AS t USING (transaction_id)
) t
WHERE rownum = 1;

С этим решением вам вообще не нужна GROUP BY, поэтому ONLY_FULL_GROUP_BY SQL-режим MySQL не влияет на это.

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

Получить следующую и предыдущую строки, упорядоченные по столбцу для подмножества таблицы
Ошибка: P1014 Базовая таблица для модели «клиенты» не существует
Как соединить две таблицы и выбрать строку на основе значения (и второго по величине значения) в столбце?
Gorm postgres запросить массив json для элемента
PostgreSql Вставить при выборе для обновления
.NET Core: параметры IEnumerable не поддерживаются, вместо этого передайте массив или список
Графана: диаграмма X-Y. Как представить данные отдельными строками для многозначной переменной
В чем может быть причина разницы в формате даты в результатах запроса в PDO и SQL?
Мне нужно написать процедуру в postgresql, которая найдет максимальное значение столбца, имеющего буквенно-цифровое значение (текст), например «RAM-1», «RAM-2»
Как я могу создать триггер, который будет распространять обновление таблицы первичного ключа?

Похожие вопросы