создать временную таблицу sql, используя рекурсию как al oop для заполнения пользовательского интервала времени - PullRequest
1 голос
/ 27 февраля 2020

Предположим, у вас есть таблица типа:

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 без ручное кодирование интервалов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...