|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Добрый день! Пожалуйста, помогите решить задачу. Описание данных: таблица ACTIVE_CLIENTS содержит ежемесячный срез клиентов банка, которые совершали какие-либо транзакции в данном месяце. Атрибуты: отчетный месяц (report_month) и идентификатор клиента (client_id). Считаем, что клиент «оттек» из банка в месяце N, если в месяце N он активен (присутствует в таблице ACTIVE_CLIENTS) и не активен в месяцы N+1, N+2, N+3. Таблица: REPORT_MONTH CLIENT_ID 2018-01-01 1847982357 2018-01-01 938475 2018-02-01 1847982357 2018-02-01 6789998 2018-03-01 67900001 … … Задание: вывести количество активных клиентов на каждый месяц; долю клиентов, которые «оттекли» в каждом месяце. Количество активных клиентов на каждый месяц вывести получилось, код: SELECT MONTHNAME(REPORT_MONTH) AS MONTH, COUNT(CLIENT_ID) FROM active_clients GROUP BY REPORT_MONTH; Просьба помочь вывести долю клиентов, которые «оттекли» в каждом месяце. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 10:13 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Выложите: - CREATE TABLE для таблицы - INSERT INTO с тест-данными - эталонный ответ для этих данных Первые два пункта лучше сделать в виде online fiddle. Например, на dbfiddle.uk Да, не забудьте указать точную версию MySQL - для такой задачи это критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 10:51 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Akina, CREATE TABLE `active_clients` ( `REPORT_MONTH` date NOT NULL, `CLIENT_ID` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `active_clients` VALUES ('2018-01-01',1847982357),('2018-01-01',938475),('2018-02-01',1847982357),('2018-02-01',6789998),('2018-03-01',67900001); MySQL Workbench 8.0 CE ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 11:11 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 11:37 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
n_script и не активен в месяцы N+1, N+2, N+3. тогда, всё-таки, немного не так ... нуу и dateadd заменишь на MySQL-ий court Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 11:58 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
n_script MySQL Workbench 8.0 CE И не вижу эталонного ответа для показанных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 12:07 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court, ну уж если пишешь под 8 версию, то зачем вязать три копии, когда есть LEAD()? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 12:08 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Akina court, ну уж если пишешь под 8 версию, то зачем вязать три копии, когда есть LEAD()? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 12:14 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court Akina court, ну уж если пишешь под 8 версию, то зачем вязать три копии, когда есть LEAD()? пс но с LEAD() будет, конечно, на порядок лучше я как-то и забыл, что в нём offset есть )) как-то никогда "не пригождался", а тут как раз в тему ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 12:37 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court, спасибо. Оптимизировала под свою версию (8.0), сработало: WITH cte AS ( SELECT t1.REPORT_MONTH, t1.CLIENT_ID, CASE WHEN t2.CLIENT_ID IS NULL AND t3.CLIENT_ID IS NULL AND t4.CLIENT_ID IS NULL THEN 0 ELSE 1 END AS flag FROM ACTIVE_CLIENTS t1 LEFT JOIN ACTIVE_CLIENTS t2 on t1.CLIENT_ID=t2.CLIENT_ID and t2.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) LEFT JOIN ACTIVE_CLIENTS t3 on t1.CLIENT_ID=t3.CLIENT_ID and t3.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) LEFT JOIN ACTIVE_CLIENTS t4 on t1.CLIENT_ID=t4.CLIENT_ID and t4.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) WHERE DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) <= (SELECT MAX(REPORT_MONTH) FROM ACTIVE_CLIENTS) ) SELECT MONTHNAME(REPORT_MONTH) AS MONTH, COUNT(CLIENT_ID) AS QUANTITY_OF_ACTIVE_CLIENTS, SUM(CASE WHEN flag=0 THEN 1.0 END)/COUNT(CLIENT_ID) AS SHARE_OF_OUTFLOW FROM cte GROUP BY REPORT_MONTH; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:15 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court, пожалуйста, объясните эту часть кода: with cte as ( select t1.REPORT_MONTH ,t1.CLIENT_ID ,case when t2.CLIENT_ID is null and t3.CLIENT_ID is null and t4.CLIENT_ID is null then 0 else 1 end as flag from active_clients t1 left join active_clients t2 on t1.CLIENT_ID=t2.CLIENT_ID and t2.REPORT_MONTH=dateadd(month,1,t1.REPORT_MONTH) left join active_clients t3 on t1.CLIENT_ID=t3.CLIENT_ID and t3.REPORT_MONTH=dateadd(month,2,t1.REPORT_MONTH) left join active_clients t4 on t1.CLIENT_ID=t4.CLIENT_ID and t4.REPORT_MONTH=dateadd(month,3,t1.REPORT_MONTH) where dateadd(month,3,t1.REPORT_MONTH) <= (select max(REPORT_MONTH) from active_clients) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:16 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court, 8.0 я начинающий программист) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:17 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
n_script FROM ACTIVE_CLIENTS t1 LEFT JOIN ACTIVE_CLIENTS t2 on t1.CLIENT_ID=t2.CLIENT_ID and t2.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) LEFT JOIN ACTIVE_CLIENTS t3 on t1.CLIENT_ID=t3.CLIENT_ID and t3.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) LEFT JOIN ACTIVE_CLIENTS t4 on t1.CLIENT_ID=t4.CLIENT_ID and t4.REPORT_MONTH=DATE_ADD(t1.REPORT_MONTH, INTERVAL 1 month) почему везде INTERVAL 1 ? должно быть 1,2,3 как в ТЗ авторне активен в месяцы N+1, N+2, N+3. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:20 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
n_script court, пожалуйста, объясните эту часть кода: with cte as ( select t1.REPORT_MONTH ,t1.CLIENT_ID ,case when t2.CLIENT_ID is null and t3.CLIENT_ID is null and t4.CLIENT_ID is null then 0 else 1 end as flag from active_clients t1 left join active_clients t2 on t1.CLIENT_ID=t2.CLIENT_ID and t2.REPORT_MONTH=dateadd(month,1,t1.REPORT_MONTH) left join active_clients t3 on t1.CLIENT_ID=t3.CLIENT_ID and t3.REPORT_MONTH=dateadd(month,2,t1.REPORT_MONTH) left join active_clients t4 on t1.CLIENT_ID=t4.CLIENT_ID and t4.REPORT_MONTH=dateadd(month,3,t1.REPORT_MONTH) where dateadd(month,3,t1.REPORT_MONTH) <= (select max(REPORT_MONTH) from active_clients) ) зафиксировали месяц/клиента в t1 и джойним к нему месяц+1, месяц+2, месяц+3 того же клиента а в case - проверяем есть ли он в этих (месяц+1, месяц+2, месяц+3) Если во всех месяцах его нет, то установили флаг "0" - это признак того, что клиент "оттёк" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:26 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
fiddle В данных - 5 клиентов. Последние три месяца, само собой, считается 100% отток, ибо дальше данные отсутствуют. Обошлось и без оконных функций. CTE легко превращается в подзапрос. Так что будет работать и на 5.x. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 14:31 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
Akina Код: sql 1.
неее, там клиент "оттёк" НЕ когда его не было хоть в одном из 3-х след.месяцах, а когда его не было ВО ВСЕХ 3-х послед.месяцах авторесли в месяце N он активен (присутствует в таблице ACTIVE_CLIENTS) и не активен в месяцы N+1, N+2, N+3 ------------ с lead() Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
REPORT_MONTHколичество активных клиентов на каждый месяцдолю клиентов, которые «оттекли» в каждом месяце2018-01-0130.0000002018-02-0140.0000002018-03-0150.2000002018-04-0130.3333332018-05-0131.000000 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 14:52 |
|
Просьба помочь решить задачу
|
|||
---|---|---|---|
#18+
court там клиент "оттёк" НЕ когда его не было хоть в одном из 3-х след.месяцах, а когда его не было ВО ВСЕХ 3-х послед.месяцах Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
fiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 16:55 |
|
|
start [/forum/search_topic.php?author=%D1%8A%D1%8A%D1%8A%D1%8A%D1%8A&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 852ms |
total: | 1149ms |
0 / 0 |