Присоединиться к отсутствующим датам совпадений - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть следующая таблица:

| variable | varDate    | match |
|----------|------------|-------|
| var1     | 15/02/2020 | 98    |
| var1     | 16/02/2020 | 99    |
| var1     | 17/02/2020 | 97    |
| var2     | 15/02/2020 | 95    |

Я хотел бы заполнить var2, для дат 16/02/2020 и 17/02/2020 (те, которые отсутствуют, и если ноль, заполнить со значением 100).

У меня есть таблица, содержащая последние три дня в таблице, которая выглядит следующим образом:

| date       |
|------------|
| 15/02/2020 |
| 16/02/2020 |
| 17/02/2020 |

Я пытался использовать левое соединение на varDate = дата, однако это не дало ожидаемого результата, как показано ниже:

| variable | date       | match |
|----------|------------|-------|
| var1     | 15/02/2020 | 98    |
| var1     | 16/02/2020 | 99    |
| var1     | 17/02/2020 | 97    |
| var2     | 15/02/2020 | 95    |
| var2     | 16/02/2020 | 100   |
| var2     | 17/02/2020 | 100   |

1 Ответ

2 голосов
/ 18 февраля 2020

Рассмотрим:

select
    v.variable,
    d.date,
    coalesce(t.match, 100) match
from (select distinct variable from mytable) v
cross join mydates d 
left join mytable t 
    on  t.varDate = d.date
    and t.variable = v.variable

Это работает сначала cross join, используя различные значения variable, доступные в таблице с таблицей, которая ссылается на даты (я назвал это mydates). Это создает все возможные комбинации дат и переменных.

Затем мы вводим исходную таблицу (я предположил mytable) с left join. Наконец, мы используем coalesce(), чтобы назначить значение по умолчанию для пропущенных match es.

В идеале у вас должна быть справочная таблица для variable s, что позволит избежать необходимости в distinct подзапрос:

select
    v.variable,
    d.date,
    coalesce(t.match, 100) match
from myvariables v
cross join mydates d 
left join mytable t 
    on  t.varDate = d.date
    and t.variable = v.variable
...