SQLite: создание количества клиентов для диапазона дат (месяцев) с использованием нормализованной таблицы - PullRequest
1 голос
/ 27 мая 2020

У меня есть набор данных воронки продаж в SQLite, и каждая строка представляет собой движение по воронке. Поскольку существует довольно много способов, которыми потенциальный покупатель может пройти по воронке (и, возможно, даже go назад), я не планировал выравнивать / денормализовать таблицу. Как я могу рассчитать «количество клиентов в месяц до сегодняшнего дня»?

Результат с приведенными выше данными должен быть:

month    | customers
Jan-2020 | 2          (cust_8, cust_9)
Feb-2020 | 1          (cust_8, cust_9) 
Mar-2020 | 1          (cust_8) # cust_9 churned
Apr-2020 | 2          (cust_8, cust_14)
May-2020 | 2          (cust_8, cust_14)

Я действительно хотел бы понять, как создать столбец month, поскольку я не могу полагаться на даты из status_change_date, так как записи могут отсутствовать. Придется ли вручную создавать этот столбец? Я знаю, что могу генерировать даты вручную, используя:

WITH RECURSIVE cnt (
   x
) AS (
  SELECT 0
    UNION ALL
  SELECT x + 1
  FROM cnt
  LIMIT (
    SELECT
      ROUND(((julianday ('2020-05-01') - julianday ('2020-01-01')) / 30) + 1))
)

SELECT
  date(julianday ('2020-01-01'), '+' || x || ' month') AS month
FROM cnt

, но интересно, есть ли лучший способ? Может быть, было бы проще создать таблицу моментальных снимков и генерировать текущее состояние каждого клиента для каждой даты?

1 Ответ

0 голосов
/ 27 мая 2020

Если у вас есть даты, вы можете использовать метод грубой силы. Это определяет самый последний статус для каждого клиента на каждую дату:

select d.date,
       sum(as_of_status = 'paying')
from (select distinct d.date, t.customer,
             first_value(status_new) over (partition by d.date, t.customer order by t. status_change_date desc) as as_of_status
      from dates d join
           t
           on t.status_change_date <= d.date
     ) dc
group by d.date
order by d.date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...