Mam mały problem w redshift z grupowaniem; Mam tabelę jak następujące:

WEJŚCIE

VALUE       CREATED       UPDATED
------------------------------------
1        '2020-09-10'   '2020-09-11'
1        '2020-09-11'   '2020-09-13'
2        '2020-09-15'   '2020-09-16'
1        '2020-09-17'   '2020-09-18'

Chcę uzyskać to wyjście:

VALUE       CREATED       UPDATED
------------------------------------
1        '2020-09-10'   '2020-09-13'
2        '2020-09-15'   '2020-09-16'
1        '2020-09-17'   '2020-09-18'

Jeśli zrobię prostą grupę min i maksymalną grupę według wartości, nie działa.

0
nasshy 18 październik 2020, 19:13

1 odpowiedź

Najlepsza odpowiedź

Jest to przykład problemu z przerwami i wyspami. Jeśli w danych nie ma luek czasowych, różnica numerów wierszy jest prostym rozwiązaniem:

select value, min(created), max(updated)
from (select t.*,
             row_number() over (order by created) as seqnum,
             row_number() over (partition by value order by created) as seqnum_2
      from t
     ) t
group by value, (seqnum - seqnum_2)
order by min(created);

Dlaczego to działa, jest trochę trudne do wyjaśnienia. Ale jeśli spojrzysz na wyniki podzewności, zobaczysz, jak różnica między numerami wiersza określa sąsiednie wiersze za pomocą tego samego {x0}}.

0
Gordon Linoff 18 październik 2020, 16:15