Как получить данные о пользователях, которые создали первые данные за определенный период времени?

Как я могу получить сумму денег во всех кошельках для тех, кто создал свои первые кошельки за последние 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 месяца». Как я могу это сделать?

Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
68
2

Ответы 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

Это не работает, потому что вы включаете владельца AAAAAAAAAAAAAAA, что означает наличие строки 45|AAAAAAAAAAAAAA|2018-06-01|2018-06-02. Его первый кошелек не был создан в течение последних 2 месяцев, поэтому эта строка не должна существовать.

Marcus Thornton 19.06.2018 11:23

Вы можете попробовать это:

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.

Marcus Thornton 19.06.2018 11:25

В результате мне нужно first_create_date, а не create_date. В вашем соединении он будет генерировать несколько строк для одного create_date, поэтому даже create_date 2018-05-06 имеет запись.

Marcus Thornton 19.06.2018 11:40

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