Мне потребовалось создать календарь, да не простой, а к которому можно при-join-ить данные. Хотел получить таблицу вида:
Казалось бы, создай табличку create table'ом. Но так нельзя, да и не интересно.
Воспользуемся рекурсией!
Вот здесь отличный пример рекурсивного запроса в DB2 (ссылка).
У меня получилась вот такая конструкция:
(1) with mycal (datetime) as (
(2) select date('2014-01-01') from sysibm.SYSDUMMY1
union all
(3) select datetime + 1 days as datetime from mycal
where datetime < date('2014-12-31')
)
(4) select
datetime, day(datetime) mycal_day, month(datetime) mycal_month, year(datetime) mycal_year
from mycal
order by datetime
Для лучшей читаемости:
В пункте (1) мы объявляем временное табличное выражение (common table expression) с одним столбцом для вывода (datetime)
В пункте (2) мы выбираем дату - начало года. Здесь может быть любая дата, например current date
В пункте (3) мы задаем. если так можно сказать, логику. как будут генериться новые данные. Здесь, на каждой итерации, будет прибавляться один день к предыдущему значению.
В пункте (4) мы выводим результат обычным select'ом
P.S. чтобы понять рекурсию, нужно понять рекурсию (с) (тут вроде бы хорошо написано про рекурсию)
Комментарии
Отправить комментарий