Извлечь сумму за минимальную дату в MySQL

Я уже задавал этот вопрос для PostgreSQL на Извлечь сумму за минимальную дату в Postgres. По сути, мне нужно получить сумму за минимальную дату для каждого аккаунта. я пробовал

SELECT B.* FROM
(SELECT amount, account, min(date)
    FROM new_schema.stg_payment_mysql GROUP BY account
) A INNER JOIN new_schema.stg_payment_mysql  B USING (account,date)

Но получил «Код ошибки: 1054. Неизвестная дата столбца в пункте «откуда» 0,781 сек».

Если я добавлю new_schema.stg_payment_mysql до даты, я получу «Код ошибки: 1064».

Я также пробовал:

SELECT amount, account, min(date) date
    FROM new_schema.stg_payment_mysql GROUB BY account

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

Для вашего первого запроса вам нужен псевдоним для min(date), например min(date) as date

forpas 24.06.2019 20:57
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Первый запрос почти правильный. Вы забыли указать свой минимум (дата)

SELECT B.* 
FROM
  (
    SELECT account, min(`date`) as mindate
    FROM new_schema.stg_payment_mysql       
    GROUP BY account
  ) A 
  INNER JOIN 
  new_schema.stg_payment_mysql  B
  ON a.account = b.account and b.`date` =  a.mindate

Я переименовал дату в mindate по двум причинам: во-первых, чтобы не называть столбец зарезервированным словом, и во-вторых, чтобы сделать более очевидным, что такое поток данных и как работает запрос.

Вам также не нужно выбирать сумму в A; это будет от б

Я уже писал сегодня о грязных данных и о том, что мне нужно использовать обрезку внутри обрезки. Итак, если я изменю ваш запрос на SELECT B.* FROM ( SELECT TRIM(LEADING '0' FROM TRIM(trim)) as account_ref_trimmed, min(`date`) as mindate FROM new_schema.stg_payment_mysql GROUP BY account ) A INNER JOIN ( SELECT TRIM(LEADING '0' FROM TRIM(trim)) as account_ref_trimmed, date, amount FROM new_schema.stg_payment_mysql ) B ON A.account_ref_trimmed= B.account_ref_trimmed and B.`date` = A.mindate, он не будет работать правильно.

eponkratova 24.06.2019 21:17

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

Raymond Nijland 24.06.2019 21:17

@RaymondNijland, вы имеете в виду, когда дата платежа совпадает? У меня есть метка времени в исходной базе данных с чч: мм: сс, поэтому вероятность того, что два платежа поступят на счет в одну и ту же секунду, низка.

eponkratova 24.06.2019 21:21

@eponkratova «Я уже публиковал сегодня» - если честно, это не то, что кто-то будет проверять, ваш вопрос должен стоять отдельно и без ссылки на какой-либо другой вопрос, особенно если вы не упомяните его и не свяжете его - мы не могу читать мысли, и я лично не являюсь круглосуточной службой, которая отслеживает каждый вопрос sql, извините. Также "если я изменю ваш запрос, он не будет работать правильно" - вы просите меня взять на себя ответственность за это? В качестве помощи я предлагаю, что похоже, что вы забыли обрезать свою группу, но, пожалуйста, никогда не жалуйтесь кому-то после того, как ты сломал их код.

Caius Jard 24.06.2019 21:24

@CaiusJard, я понимаю и извиняюсь! Мне нужно просмотреть данные, я чувствую, что ваш запрос верен, но неверны данные, вызванные тем, что на самом деле описал Рэймонд. Не должно быть, чтобы два платежа попали на счет, если только это не системный сбой. Итак, я получил платежи на один аккаунт с одинаковыми чч:мм:сс, что технически невозможно.

eponkratova 24.06.2019 21:30

Возможно, лучше рассмотреть модель данных с возрастающим порядковым номером для каждого платежа по счету, чтобы вы могли быть уверены, что у вас есть только один минимум. Системы, которые полагаются на то, что «только одна из этих вещей происходит время от времени, поэтому столбец даты должен быть в порядке», обычно уступают чему-то глупому, например, двойному щелчку пользователя, задержке обработки первого события в пользовательском интерфейсе, а затем два файла событий в файле. та же миллисекунда.. достаточно сказать, что правильно настроенное возрастающее число должно справляться даже с теми

Caius Jard 24.06.2019 22:40

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