Разделение диапазона дат по отдельным датам - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть таблица со следующими функциями: идентификатор счета, billing_period_start, billing_period_end и items_purchased в течение этого периода.

Я хочу разбить диапазон дат по отдельным датам.Диапазон дат может содержаться в течение одного месяца, но он также может быть неравномерно распределен по двум месяцам.Это эффективно создаст намного больше записей, чем в настоящее время в таблице.После того, как я это сделаю, мне нужно равномерно распределить количество купленных предметов между этими датами диапазона дат.

billing_period_start      billing_period_end
--------------------      ------------------
2010-03-05                2010-03-07
2010-04-29                2010-05-05
2010-06-29                2006-08-12

billing_date
------------
2010-03-05  
2010-03-06
2010-03-07
2010-04-29
2010-04-30
2010-05-01
   ...
2010-05-05
2010-06-29
2010-06-30
   ...
2010-08-12

Теперь, когда диапазон дат разбит на отдельные даты, мне нужно взять items_purchase иразделите его на количество дней в расчетном периоде для каждой даты, чтобы у меня была items_purchase_per_date.

select
  invoice_line_id AS invoice_id
  ,items_purchased
  ,billing_period_start
  ,billing_period_end
  ,date_from_parts(YEAR(billing_period_start), MONTH(billing_period_start), 1) AS period1_month_start
  ,last_day(month_start, month) AS period1_month_end
  ,datediff(day, billing_period_start, billing_period_end) + 1 AS billing_period_length
from "INVOICE_DATA"
order by 1;

Я запускаю это на Snowflake, но могу легко конвертировать из mySQL, если кто-то знаетэта СУБД лучше.

1 Ответ

0 голосов
/ 07 января 2019

Лучший способ справиться с этим в хранилище данных - это использовать таблицу измерений даты .Это таблица, которая содержит все даты, необходимые для анализа, а также любые интересные атрибуты даты, такие как неделя / месяц / квартал и т. Д., К которой относится дата, и т. Д.

Если у вас есть таблица с уникальными строками для всех релевантных дат, вы можете легче решать такие задачи, как эта.Например, для вашего случая вы бы написали (предполагая, что dates - это имя вашего измерения даты, а calendar_date - имя столбца, содержащего уникальные даты:

select
    d.calendar_date,
    i.*
from
    dates d
    join
    invoice_data i
        on d.calendar_date between i.billing_period_start and i.billing_period_end

Теперь у вас есть одна строказа дату между этими датами начала / окончания, и вы можете выполнять ежедневное распределение счетов.

...