В abonents — срез базы на каждый отчётный месяц tbm (первое число месяца): номер app_n, дата активации act_day, регион и тарифная группа. В charges — начисления за месяц, по номеру может быть несколько строк (разные услуги), revenue бывает NULL. Суммы не отрицательные.
Для каждого месяца, региона и тарифной группы посчитайте: subscribers — абонентов в срезе; no_charge_pct — процент абонентов, у которых за этот месяц начислений нет совсем, все они NULL или их сумма 0 (округлить до 0,1); activated — сколько номеров активировано в том же месяце, что и отчётный.
Названия региона и группы — из справочников regions и tp_groups. Порядок — tbm, region_name, tp_group_name.
В работе: Ежемесячный отчёт по базе: где номера висят без трафика и платежей и откуда идут новые подключения.
Таблицы
abonents — одна строка — номер в срезе отчётного месяца
| Колонка | Тип | Что значит |
|---|---|---|
tbm | date | отчётный месяц, первое число |
app_n | bigint | номер |
act_day | date | дата активации |
region_id | int | регион |
tp_group_id | int | тарифная группа |
charges — начисления за месяц, несколько строк на номер
| Колонка | Тип | Что значит |
|---|---|---|
tbm | date | отчётный месяц |
app_n | bigint | номер |
service | text | услуга |
revenue | numeric | сумма, может быть NULL |
regions — справочник регионов
| Колонка | Тип | Что значит |
|---|---|---|
region_id | int | ключ |
region_name | text | название |
tp_groups — справочник тарифных групп
| Колонка | Тип | Что значит |
|---|---|---|
tp_group_id | int | ключ |
tp_group_name | text | название |
Пример: данные
abonents · 7 строк
| tbm | app_n | act_day | region_id | tp_group_id |
|---|---|---|---|---|
| 2018-01-01 | 9160001001 | 2018-01-12 | 1 | 1 |
| 2018-01-01 | 9160001002 | 2017-01-20 | 1 | 1 |
| 2018-01-01 | 9160001003 | 2016-05-02 | 1 | 1 |
| 2018-01-01 | 9130002004 | 2018-01-03 | 2 | 2 |
| 2018-01-01 | 9130002005 | 2017-11-30 | 2 | 2 |
| 2018-02-01 | 9160001001 | 2018-01-12 | 1 | 1 |
| 2018-02-01 | 9160001002 | 2017-01-20 | 1 | 1 |
charges · 7 строк
| tbm | app_n | service | revenue |
|---|---|---|---|
| 2018-01-01 | 9160001001 | абонплата | 450 |
| 2018-01-01 | 9160001001 | роуминг | 120 |
| 2018-01-01 | 9160001003 | абонплата | 0 |
| 2018-01-01 | 9130002004 | абонплата | NULL |
| 2018-01-01 | 9130002005 | абонплата | 990 |
| 2018-02-01 | 9160001001 | абонплата | 570 |
| 2018-02-01 | 9160001002 | абонплата | 300 |
regions · 2 строки
| region_id | region_name |
|---|---|
| 1 | Москва |
| 2 | Новосибирская область |
tp_groups · 2 строки
| tp_group_id | tp_group_name |
|---|---|
| 1 | Безлимит |
| 2 | Корпоративный |
Ожидаемый ответ
| tbm | region_name | tp_group_name | subscribers | no_charge_pct | activated |
|---|---|---|---|---|---|
| 2018-01-01 | Москва | Безлимит | 3 | 66,7 | 1 |
| 2018-01-01 | Новосибирская область | Корпоративный | 2 | 50 | 1 |
| 2018-02-01 | Москва | Безлимит | 2 | 0 | 0 |
SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
tbm, region_name, tp_group_name, subscribers, no_charge_pct, activated
Источник: техническое задание МТС из портфолио аналитика на GitHub, 2018. Условие пересказано своими словами.
Посмотреть данные, проверить кусок запроса. На зачёт не влияет.
Здесь появится результат отправки.