Windows функций или по дате, когда некоторые даты не существуют - PullRequest
2 голосов
/ 29 апреля 2020

Предположим, этот пример запроса:

select
id
, date
, sum(var) over (partition by id order by date rows 30 preceding) as roll_sum
from tab

Если в столбце даты отсутствуют некоторые даты, окно не будет учитывать несуществующие даты. Как я могу сделать это объединение ветров, включая эти несуществующие даты?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

Вы можете присоединиться к последовательности, содержащей все даты за нужный интервал.

select
  *
from (
  select
    d.date,
    q.id,
    q.roll_sum
  from unnest(sequence(date '2000-01-01', date '2030-12-31')) d
  left join ( your_query ) q on q.date = d.date
) v
where v.date > (select min(my_date) from tab2)
  and v.date < (select max(my_date) from tab2)
1 голос
/ 29 апреля 2020

Я не думаю, что Presto поддерживает оконные функции с диапазонами интервалов. Увы. Существует старомодный способ сделать это путем подсчета значений входов и выходов значений:

with t as (
      select id, date, var, 1 as is_orig
      from t
      union all
      select id, date + interval '30 day', -var, 0
      from t
     )
select id.*
from (select id, date, sum(var) over (partition by id order by date) as running_30,
             sum(is_org) as is_orig
      from t
      group by id, date
     ) id
where is_orig > 0
1 голос
/ 29 апреля 2020

В стандартном SQL вы обычно используете спецификацию диапазона окна, например:

select
    id,
    date,
    sum(var) over (
        partition by id 
        order by date 
        range interval '30' day preceding
    ) as roll_sum
from tab

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

select
    id,
    date,
    (
        select sum(var) 
        from tab t1 
        where 
            t1.id = t.id 
            and t1.date >= t.date - interval '30' day
            and t1.date <= t.date
    ) roll_sum
from tab t
...