Я уже задавал этот вопрос для 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
Но сумма была выбрана неправильно. Я чувствую, что первый запрос правильный, но я не понимаю ошибки.






Первый запрос почти правильный. Вы забыли указать свой минимум (дата)
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, он не будет работать правильно.
Имейте в виду, что это будет выбирать связи в случаях, когда минимальная дата для группы совпадает с тем, что автор темы не предоставил информацию, что делать в этих случаях.
@RaymondNijland, вы имеете в виду, когда дата платежа совпадает? У меня есть метка времени в исходной базе данных с чч: мм: сс, поэтому вероятность того, что два платежа поступят на счет в одну и ту же секунду, низка.
@eponkratova «Я уже публиковал сегодня» - если честно, это не то, что кто-то будет проверять, ваш вопрос должен стоять отдельно и без ссылки на какой-либо другой вопрос, особенно если вы не упомяните его и не свяжете его - мы не могу читать мысли, и я лично не являюсь круглосуточной службой, которая отслеживает каждый вопрос sql, извините. Также "если я изменю ваш запрос, он не будет работать правильно" - вы просите меня взять на себя ответственность за это? В качестве помощи я предлагаю, что похоже, что вы забыли обрезать свою группу, но, пожалуйста, никогда не жалуйтесь кому-то после того, как ты сломал их код.
@CaiusJard, я понимаю и извиняюсь! Мне нужно просмотреть данные, я чувствую, что ваш запрос верен, но неверны данные, вызванные тем, что на самом деле описал Рэймонд. Не должно быть, чтобы два платежа попали на счет, если только это не системный сбой. Итак, я получил платежи на один аккаунт с одинаковыми чч:мм:сс, что технически невозможно.
Возможно, лучше рассмотреть модель данных с возрастающим порядковым номером для каждого платежа по счету, чтобы вы могли быть уверены, что у вас есть только один минимум. Системы, которые полагаются на то, что «только одна из этих вещей происходит время от времени, поэтому столбец даты должен быть в порядке», обычно уступают чему-то глупому, например, двойному щелчку пользователя, задержке обработки первого события в пользовательском интерфейсе, а затем два файла событий в файле. та же миллисекунда.. достаточно сказать, что правильно настроенное возрастающее число должно справляться даже с теми
Для вашего первого запроса вам нужен псевдоним для
min(date), напримерmin(date) as date