Добавление интервалов как части оператора SQL

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

У меня есть таблица с start_date, end_date и часами. Предположим, у меня есть одна строка start_date 1 января 2015 года, end_date 31 декабря 2015 года и часов 120. Я хочу получить результат из 12 строк по 10 часов в каждой строке и месяц

так что-то вроде

|Jan 15|10|
|Feb 15|10|
...
|Dec 15|10|

Мне нужно десять, потому что я делю 120 часов на количество месяцев (12). 120 / 12 = 10

Могу ли я это сделать вообще? Или что-то подобное? Я подозреваю, что мне, возможно, придется делать ETL в коде, а не в SQL. У кого-нибудь есть идеи о том, как я могу приблизиться к тому, чего хочу?

Спасибо


person RNJ    schedule 04.11.2015    source источник


Ответы (1)


Вам просто нужны таблицы чисел. Если бы он у вас был, вы могли бы сделать:

select add_months(start_date, n.n - 1),
       val / (months_between(start_date, end_date) + 1)
from t join
     numbers n
     on add_months(start_date, n.n - 1) <= end_date;

Вы можете создать таблицу numbers различными способами. Простой способ примерно такой:

with numbers as (
      select rownum as n
      from t
      where rownum <= 100
     )
person Gordon Linoff    schedule 04.11.2015
comment
спасибо за ответ @gordonlinoff. Если я создам числовую таблицу с помощью... будет ли она создана только для этой транзакции? Я хочу запустить этот SQL в базе данных prod, поэтому не хочу на это влиять. Спасибо - person RNJ; 04.11.2015
comment
rownum Трюк здесь — это один из метод генератора строк для Oracle. Эти методы не создают реальных таблиц в базе данных, а только временные наборы данных, которые вы можете использовать как часть вашего основного запроса. Возможно, @Gordon мог бы отредактировать ответ, включив в него полный запрос с генератором строк? - person Mick Mnemonic; 04.11.2015