Как рассчитать текущее значение строки на основе данных последних 56 дней - PullRequest
0 голосов
/ 11 января 2019
country_id  store_id    item_id wh_id   date    fg
23  9,478   1,007,047   9,074   3/5/2018    0
23  9,478   1,007,047   9,074   3/7/2018    0
23  9,478   1,007,047   9,074   3/10/2018   0
23  9,478   1,007,047   9,074   3/11/2018   1
23  9,478   1,007,047   9,074   3/17/2018   0
23  9,478   1,007,047   9,074   3/18/2018   1
23  9,478   1,007,047   9,074   3/27/2018   0
23  9,478   1,007,047   9,074   3/28/2018   0
23  9,478   1,007,047   9,074   3/29/2018   0

Это исходные данные, целевое правило расчета Когда fg=1 и существует хотя бы 1 запись с fg=0 за последние 56 дней (все даты недоступны в источнике), тогда она будет установлена ​​на 1, иначе 0.

Я пытался сделать это с помощью функций OLAP, но функция OLAP работает по строкам, и мне нужны даты данных.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Это должно вернуть то, что вы хотите:

SELECT tab.*
  ,CASE WHEN fg = 1
             -- latest row with "fg = 0"
         AND Last_Value(CASE WHEN fg = 0 THEN datecol END IGNORE NULLS)
             Over (PARTITION BY store_id           -- or whatever you need
                   ORDER BY datecol) > datecol-56  -- maybe ">= datecol-56"
        THEN 1 
        ELSE 0 
   END
FROM tab
0 голосов
/ 11 января 2019

Вы, кажется, хотите что-то вроде этого:

select (case when fg = 1 and
                  max(case when fg = 0 then date end) over
                     (partition by country_id, store_id, item_id, wh_id
                      order by date
                      rows between unbounded preceding and current row
                     ) >= date + interval '-56' day
             then 1 else 0
         end) as target

Я догадываюсь, что такое столбцы разделения. Логика проста. , , вычислите самую последнюю дату с помощью fg = 0 и используйте ее для сравнения.

...