Dadas duas tabelas:
CREATE TABLE foo (ts timestamp, foo text);
CREATE TABLE bar (ts timestamp, bar text);
Eu gostaria de escrever uma consulta que retorna valores para ts
, foo
e bar
que representa uma visão unificada dos valores mais recentes. Em outras palavras, se foo
contido:
ts | foo
--------
1 | A
7 | B
e bar
continha:
ts | bar
--------
3 | C
5 | D
9 | E
Eu quero uma consulta que retorne:
ts | foo | bar
--------------
1 | A | null
3 | A | C
5 | A | D
7 | B | D
9 | B | E
Se as duas tabelas tiverem um evento ao mesmo tempo, o pedido não importará.
Consegui criar a estrutura necessária usando os valores union all e dummy:
SELECT ts, foo, null as bar FROM foo
UNION ALL SELECT ts, null as foo, bar FROM bar
que fornecerá uma linha do tempo linear de novos valores, mas não sou capaz de descobrir como preencher os valores nulos com base nas linhas anteriores. Eu tentei a lag
função de janela, mas AFAICT só vai olhar para a linha anterior, não recursivamente para trás. Eu observei CTEs recursivas, mas não sei ao certo como configurar as condições de início e término.
postgresql
join
window-functions
Christopher Currie
fonte
fonte
foo
ebar
estritamente ascendente ao longo do tempo ou é o caso de teste enganosa a este respeito?Respostas:
Use a
FULL [OUTER] JOIN
, combinado com duas rodadas de funções da janela :Como
count()
não conta valores NULL, convenientemente aumenta apenas com todos os valores não nulos, formando grupos que compartilham o mesmo valor. No exteriorSELECT
,min()
(oumax()
) também ignora valores NULL, escolhendo assim um valor não nulo por grupo. Voilá.FULL JOIN
Caso relacionado :É um daqueles casos em que uma solução processual pode ser mais rápida, pois pode fazer o trabalho em uma única digitalização. Como esta função plpgsql :
Ligar:
db <> mexer aqui , demonstrando ambos.
Resposta relacionada que explica o
#variable_conflict use_column
:fonte
coalesce
função de janela semelhante.EXPLAIN ANALYZE
, melhor de 5 ...?IGNORE NULLS
(como a Oracle: sqlfiddle.com/#!4/fab35/1 ).''
e NULL.