Предположим, у вас есть таблица типа:
id subscription_start subscription_end segment
1 2016-12-01 2017-02-01 87
2 2016-12-01 2017-01-24 87
...
И wi sh для создания временной таблицы с месяцами.
Одним из способов было бы закодировать дату месяца следующим образом:
with months as (
select
'2016-12-01' as 'first',
'2016-12-31' as 'last'
union
select
'2017-01-01' as 'first',
'2017-01-31' as 'last'
...
) select * from months;
Чтобы у меня была выходная таблица, например:
first_day last_day
2017-01-01 2017-01-31
2017-02-01 2017-02-31
2017-03-01 2017-03-31
Я хотел бы создать временную таблицу с пользовательским интервалом (выше), без ручного кодирования всех дат.
Скажите, что интервал составляет 12 месяцев для каждого года столько же лет, сколько в БД. Я хотел бы иметь общий подход для вычисления таблицы months
с тем же выводом, что и выше.
Или можно настроить диапазон на произвольный интервал (месяцы делятся на год на 12 частей, но один может захотеть разделить время в произвольном интервале дней).
Для начала я подумал использовать рекурсивный запрос, например:
with months(id, first_day, last_day, month) as (
select
id,
first_day,
last_day,
0
where
subscriptions.first_day = min(subscriptions.first_day)
union all
select
id,
first_day,
last_day,
months.month + 1
from
subscriptions
left join months on cast(
strftime('%m', datetime(subscriptions.subscription_start)) as int
) = months.month
where
months.month < 13
)
select
*
from
months
where
month = 1;
, но он не выполняет то, что я ожидаемо: здесь я пытался выбрать первую строку в таблице с минимальной датой и заполнять таблицу с интервалом в месяцы от 1 до 12. Для каждого месяца я сравнивал поле даты строки моей таблицы (например, 2017-03-01 = 3 марта).
Приведенный выше запрос работает и также кажется немного сложным, но ради изучения, какую альтернативу вы бы предложили создать временную таблицу months
без ручное кодирование интервалов?