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
; если возможно, я хотел бы сохранить это таким образом.
Отвечает ли это на ваш вопрос? Получить строки, которые имеют максимальное значение для столбца для каждого отдельного значения другого столбца
Пожалуйста, задайте 1 конкретный исследовательский вопрос, не повторяющийся. Пожалуйста, либо задайте 1 неверный запрос/функцию с обязательным минимальным воспроизводимым примером , в том числе, почему вы думаете, что он должен возвращать что-то еще, или не уверены в 1-м подвыражении, что он не дает того, что вы ожидаете, или застряли, обосновано ссылкой к официальной документации или спросите о своей общей цели, предоставив рабочие части, которые вы можете сделать, с обоснованием и минимально воспроизводимым примером . Тогда неправильно понятый код неуместен. Но, пожалуйста, сначала спросите о неожиданном поведении, потому что неправильные представления мешают вашей цели. Как задать вопрос Справочный центр Основные вопросы — это часто задаваемые вопросы.
Я исправил много дезорганизации, избыточности и шума. Пожалуйста, рассмотрите эти аспекты отредактированного поста. Что касается деталей фразировки, я редактирую так много плохого текста, что удаляю все, что могу, что не нужно, хотя иногда я оставляю обороты фразы. Но я не согласен с тем, что здесь стоит восстанавливать какую-то "особую формулировку". Пожалуйста, не прячьте код в сниппеты, люди должны его прочитать. PS Пожалуйста, задайте вопрос о MySQL или вопрос о PostgreSQL и отредактируйте в соответствии с моими комментариями. (Между тем) Оба дубликата актуальны, вы не привели минимальный воспроизводимый пример, вы просто вывалили неправильный код. Закрепить до 1 выпуска.
Пожалуйста, не редактируйте таким образом, чтобы сделать недействительными разумные опубликованные ответы. Хотя я не считаю разумными ответы на неясный вопрос, который представляет собой несколько вопросов, которые, как знает ответчик, являются дубликатами много раз. Они беспорядок. PS Meta Stack Overflow Meta Stack Exchange PS Когда люди думают, что им нужно кричать, им почти всегда нужна хорошая организация и фразировка. PS Пожалуйста, избегайте социальных и мета-комментариев в сообщениях.
@philipxy Я ценю ваш ценный вклад, я добавлю его к моему 8,5-летнему опыту задавать и редактировать вопросы. Что касается «крика», этот прием письма называется «подчеркнуть», и иногда он необходим, если он явно не запрещен. Это как-раз тот случай.
Я знаю, что это акцент и «им почти всегда нужна» «хорошая организация и формулировка вместо этого», и это имеет место здесь, и поэтому я упомянул об этом. Также теперь в этом посте нет вопроса, вы заменили вопрос на (мета) утверждение. Кроме того, бесполезно говорить, что вы что-то пробовали или исследовали, не сообщая конкретных результатов, имеющих отношение к тому, о чем вы спрашиваете; Я оставил некоторые здесь в своем последнем редактировании, чтобы показать, что в этом посте было больше связанных попыток неправильного кода, каждая из которых должна получить 1 вопрос. Пожалуйста, отреагируйте на остальные мои комментарии. минимальный воспроизводимый пример Также те 2 ссылки, которые я дал, являются дубликатами. Удачи.
Вот решение, использующее оконные функции, которые долгое время поддерживаются 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 не влияет на это.
Какую версию MySQL вы можете использовать? Можно ли использовать MySQL 8.0 или требуется поддержка MySQL 5.x?