Как я могу получить сумму денег во всех кошельках для тех, кто создал свои первые кошельки за последние 2 месяца?
Я создал скрипт SQL, чтобы проиллюстрировать таблицы. Вы можете использовать это, чтобы увидеть и запустить SQL. Моя схема таблицы и образцы данных
Описание схемы таблицы и примеров данных приведено ниже.
У меня 2 стола. Первый называется wallet, с столбцами wallet_id, wallet_owner_id, create_date. У нас много владельцев кошельков, и каждый владелец кошелька может иметь несколько кошельков. create_date указывает, когда кошелек был создан. И wallet_id, и wallet_owner_id уникальны.
например
create table wallet(wallet_id int,wallet_owner_id varchar(20),create_date date);
insert into wallet values
(100000010,'AAAAAAAAAAAAAAA','2017-09-02'),
(100000034,'AAAAAAAAAAAAAAA','2018-06-02'),
(100000132,'BBBBBBBBBBBBBBB','2017-05-03'),
(100001110,'CCCCCCCCCCCCCCC','2018-05-02'),
(100000345,'CCCCCCCCCCCCCCC','2018-05-06');
Вторая таблица называется deposit со столбцами wallet_owner_id, check_date, amount_in_all_wallets. Есть только одна строка для wallet owner в ckeck date
например
create table deposit (amount_in_all_wallets int,wallet_owner_id varchar(20),check_date date);
insert into deposit values
(45,'AAAAAAAAAAAAAAA','2018-06-01'),
(89,'BBBBBBBBBBBBBBB','2018-06-01'),
(97,'CCCCCCCCCCCCCCC','2018-06-01'),
(11,'CCCCCCCCCCCCCCC','2018-06-02');
Поскольку AAAAAAAAAAAAAAA и BBBBBBBBBBBBBBB оба создали кошельки до последних 2 месяцев, результаты должны быть
amount_in_all_wallets|wallet_owner_id|check_date|first_create_date
97 |CCCCCCCCCCCCCCC|2018-06-01|2018-05-02
11 |CCCCCCCCCCCCCCC|2018-06-02|2018-05-02
Запрос :
SELECT d.amount_in_all_wallets, d.wallet_owner_id, d.check_date, min(d.create_date) as first_create_date
FROM deposit d
JOIN wallet w ON d.wallet_owner_id = w.wallet_owner_id
WHERE w.create_date > '2018-05-01'
Это не работает, потому что я не мог найти способ реализовать идею «создали свои первые кошельки за последние 2 месяца». Как я могу это сделать?






Вы можете добавить еще одно условие для INNER JOIN, которое проверяет желаемые даты:
SELECT amount_in_all_wallets,
w.wallet_owner_id,
check_date,
MIN(w.create_date) AS first_create_date
FROM wallet w
JOIN deposit d ON w.wallet_owner_id = d.wallet_owner_id
AND DATE_SUB(NOW(), INTERVAL 2 MONTH) <=
(SELECT MIN(create_date)
FROM wallet
WHERE wallet_owner_id = w.wallet_owner_id)
GROUP BY amount_in_all_wallets,
w.wallet_owner_id,
check_date
Вы можете попробовать это:
select *
from deposit d join (
select wallet_owner_id, min(create_date) create_date from wallet
group by wallet_owner_id
having min(create_date) >= date_add(now(), interval -2 month)
) w on w.wallet_owner_id = d.wallet_owner_id;
Это не работает. Строка 45|AAAAAAAAAAAAAA|2018-06-01|2018-06-02 не должна существовать в результате. Первый кошелек AAAAAAAAAAAAAA не был создан в течение последних 2 месяцев, поэтому мне нужно исключить данные AAAAAAAAAAAAAA.
В результате мне нужно first_create_date, а не create_date. В вашем соединении он будет генерировать несколько строк для одного create_date, поэтому даже create_date 2018-05-06 имеет запись.
Это не работает, потому что вы включаете владельца AAAAAAAAAAAAAAA, что означает наличие строки
45|AAAAAAAAAAAAAA|2018-06-01|2018-06-02. Его первый кошелек не был создан в течение последних 2 месяцев, поэтому эта строка не должна существовать.