среда, 17 сентября 2014 г.

DB2, календарь, рекурсия

Мне потребовалось создать календарь, да не простой, а к которому можно при-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. чтобы понять рекурсию, нужно понять рекурсию (с) (тут вроде бы хорошо написано про рекурсию)

Комментариев нет :

Отправить комментарий