Biorąc pod uwagę dwie tabele:
CREATE TABLE foo (ts timestamp, foo text);
CREATE TABLE bar (ts timestamp, bar text);
Chciałbym napisać kwerendę, która zwraca wartości ts
, foo
i bar
który reprezentuje jednolity obraz najnowszych wartości. Innymi słowy, jeśli foo
zawiera:
ts | foo
--------
1 | A
7 | B
i bar
zawierał:
ts | bar
--------
3 | C
5 | D
9 | E
Chcę kwerendy, która zwraca:
ts | foo | bar
--------------
1 | A | null
3 | A | C
5 | A | D
7 | B | D
9 | B | E
Jeśli obie tabele mają jednocześnie zdarzenie, kolejność nie ma znaczenia.
Udało mi się stworzyć potrzebną strukturę, używając sumy wszystkich i wartości zastępczych:
SELECT ts, foo, null as bar FROM foo
UNION ALL SELECT ts, null as foo, bar FROM bar
co da mi liniową oś czasu nowych wartości, ale nie jestem w stanie wypracować sposobu zapełniania wartości zerowych na podstawie poprzednich wierszy. Próbowałem lag
funkcji okna, ale AFAICT będzie patrzeć tylko na poprzedni wiersz, a nie rekurencyjnie do tyłu. Patrzyłem na rekurencyjne CTE, ale nie jestem pewien, jak skonfigurować warunki początkowe i końcowe.
postgresql
join
window-functions
Christopher Currie
źródło
źródło
foo
ibar
ściśle rosną w miarę upływu czasu, czy też przypadek testowy wprowadza w błąd pod tym względem?Odpowiedzi:
Użyj a
FULL [OUTER] JOIN
w połączeniu z dwiema rundami funkcji okna :Ponieważ
count()
nie liczy wartości NULL, dogodnie zwiększa się tylko z każdą wartością inną niż null, tworząc grupy, które będą miały tę samą wartość. W zewnętrznymSELECT
,min()
(amax()
) również nie uwzględnia wartości NULL, przez wybranie jednego wartość niezerową w grupie. Voilá.Powiązana
FULL JOIN
sprawa:Jest to jeden z tych przypadków, w których rozwiązanie proceduralne może być po prostu szybsze, ponieważ może wykonać zadanie w jednym skanie. Podobnie jak ta funkcja plpgsql :
Połączenie:
db <> skrzypce tutaj , demonstrując oba.
Powiązana odpowiedź wyjaśniająca
#variable_conflict use_column
:źródło
coalesce
podobnej do funkcji okna.EXPLAIN ANALYZE
, najlepszy z 5 ...?IGNORE NULLS
(tak jak Oracle: sqlfiddle.com/#!4/fab35/1 ).''
NULL od.