Соедините 2 таблицы временных рядов с разными частотами с несколькими условиями - PullRequest
0 голосов
/ 13 апреля 2019

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

Вот что я пробовал до сих пор:

select daily.id, daily.date, daily.value as dly_value, quarterly.value as qly_value
from daily
full outer join quarterly on daily.id = quarterly.id
and daily.date = quarterly.date
where daily.type = 'dly_type'
and quarterly.type = 'qly_type'
and daily.id = 16

Но это возвращает только те строки, которые соответствуют квартальным датам.Если я опускаю сопоставление строк в датах, я получаю все дневные данные, а также квартальные данные, но не выровненные по дате.

Очевидно, что я упускаю что-то очевидное, но я явно не спрашиваю Googleвопрос в правильном направлении!

Ответы [ 2 ]

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

То, что вы описываете, это left join, а не full join - все ежедневные данные с соответствующими значениями за квартал:

select d.id, d.date, d.value as dly_value, q.value as qly_value
from daily d left join
     quarterly q
     on d.id = q.id and
        d.date = q.date and
        q.type = 'qly_type'
where d.type = 'dly_type' and
      d.id = 1;  -- this is suspicious.  Doesn't this match only one daily row?

Ваши условия присоединения являются подозрительными.Почему вы присоединяетесь к id и date?Интересно, это корень твоей проблемы?Итак, я подозреваю, что вы действительно хотите:

select d.id, d.date, d.value as dly_value, q.value as qly_value
from daily d left join
     quarterly q
     on d.date = q.date and
        q.type = 'qly_type'
where d.type = 'dly_type';

Full join редко требуется.Если вам это действительно нужно и вы хотите отфильтровать обе таблицы, я рекомендую выполнить фильтрацию в подзапросах:

select d.id, d.date, d.value as dly_value, q.value as qly_value
from (select d.*
      from daily d
      where d.type = 'dly_type' and
            d.id = 1
     ) d full join
     (select q.*
      from quarterly q
      where q.type = 'qly_type'
     ) q
     on d.id = q.id and
        d.date = q.date
0 голосов
/ 13 апреля 2019

это будет работать:

select daily.id, daily.date, daily.value as dly_value, quarterly.value as qly_value
from daily
full outer join quarterly on daily.id = quarterly.id
and date_trunc('DAY',daily.date) = date_trunc('DAY',quarterly.date)
where daily.type = 'dly_type'
and quarterly.type = 'qly_type'
and daily.id = 16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...