Есть ли способ добавить цикл в DB2? - PullRequest
0 голосов
/ 03 апреля 2019

В настоящее время у меня есть запрос, настроенный через Unions [кодовый блок 1] для сбора данных.Он работает правильно, но очень неэффективно, чтобы повторять это много раз

Есть ли способ преобразовать это в цикл while в DB2?

Я пытался написать цикл while в [Code Block 2], но он не работает в DB2.

Я получаю синтаксическую ошибку в Code_block_2

В блоке кода 2 я хочу добавить 1 к переменным даты начала и окончания, чтобы следующий запрос выполнялся с новыми периодами времени (сохраненными как целые числа), например, 1-й раз будет между 201601 и 201701, второй раз будет между 201602 и201702. Я попытался настроить end_dt для печати с каждой строкой данных

Метод объединения работает, но я должен написать один и тот же кусок кода несколько раз.Цикл будет более эффективным

[кодовый блок 1 - Union (Works)]

select
  1 as a.period,
  a.name,
  a.date
from
  data_table
where
  month between 201601 and 201701
union
select
  1 as period,
  a.name,
  a.date
from
  data_table a
where
  a.month between 201602 and 201702 -- this is changing in a consistent pattern
union
select
  1 as period,
  a.name,
  a.date
from
  data_table a
where
  a.month between 201603 and 201703

[кодовый блок 2 - с попыткой цикла]

Begin atomic
declare @end_dt integer default 201701;
declare @start_dt integer default 201601;
while @end_dt < 201712  do 
   --statement
   select
     @end_dt as period,
     a.name,
     a.date
   from
     data_table a
   where
      month between @start_dt and @end_dt;
-- add + 1 to variables
set @end_dt = @end_dt +1;
set @start_dt = @start_dt +1;
end while;
end;

здесьпример набора данных

(в базе данных)

имя - дата Джейн - 05.05.2016Джим - 3.06.2016Зак - 01.01.2016Джилл - 01.05.2016Джо - 01.01.2016Джеймс - 01.04.2016Зои - 02.02.2016

Вывод (ожидается, и результат блока кода 1.)

Период - Имя - дата201701 - Джейн - 5/2/2016201701 - Джим - 03.06.2016201701 - Зак - 01.01.2016201701 - Jill - 01.05.2016201701 - Джо - 01.01.2016201701 - Джеймс - 01.04.2016201701 - Zoe - 02.02.2016201702 - Джейн - 5/2/2016201702 - Джим - 3.06.2016201702 - Джилл - 01.05.2016201702 - Джеймс - 01.04.2016201702 - Зои - 02.02.2016

- обратите внимание, как даты 1 января 2016 года сочетаются с периодом 201702 годаЯ не уверен на 100% в версии DB2, но она совместима с DB2 для Linux Unix и Windows 10.5 и z / OS

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Выполните следующий запрос как есть.
Это «виртуальная» таблица range, которую вы ищете?

with t(n, m) as (
select 1, date(to_date(201601, 'YYYYMM')) from sysibm.sysdummy1
  union all
select n+1, m + 1 month
from t 
where n<11
)
, range (start, end) as (
select year(m)*100+month(m) as start, year(m + 1 year)*100+month(m + 1 year) as end
from t
)
select start, end
from range r;

Если да, то вы можете присоединиться к этой таблице range сваш data_table при условии a.month between r.start and r.end для получения предоставленного вами результата.

0 голосов
/ 04 апреля 2019

Есть ли в системе таблица дат / календаря?

Если нет, я просто добавляю таблицу значений. Это можно изменить на все, что вам нужно. Ему просто нужно иметь список значений даты ГГГГММ за нужный период.

select
  dates.period,
  a.name,
  a.date
from
  table( values 
         (201701)
,(201702)
,(201703)
,(201704)
,(201705)
,(201706)
,(201707)
,(201708)
,(201709)
,(201710)
,(201711)
,(201712)
) date(period)
join
  data_table
    on a.month between (date.period - 100) and date.period
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...