/ / SQL Group tylko przez wiersze korelacyjne - sql, group-by, vertica

Grupa SQL tylko przez wiersze korelacyjne - sql, group-by, vertica

Powiedz, że mam następującą tabelę:

Code A  B  C Date       ID
------------------------------
50   1  1  A 2018-01-08 150001
50   1  1  A 2018-01-15 165454
50   1  1  B 2018-02-01 184545
50   1  1  A 2018-02-02 195487

Potrzebuję kwerendy sql do wyprowadzania następujące:

Code A  B  C Min(Date)  Min(ID)
-------------------------------
50   1  1  A 2018-01-08 150001
50   1  1  B 2018-02-01 184545
50   1  1  A 2018-02-02 195487

Jeśli używam standardowej grupy przez, wiersze 1,2,4 sązgrupowane w jednym rzędzie, a tego nie chcę. Chcę wybrać wiersz z MIN (data) i MIN (identyfikator) z duplikatów, które są razem na podstawie kodu kolumny, A, B i C w tym przypadku pierwsze 2 wiersze są duplikatami, więc chcę mieć wiersz min (). a trzeci i czwarty rząd są różne.

Należy zauważyć, że bazą danych jest Vertica 8.1, która jest bardzo podobna do Oracle lub PostgreSQL

Odpowiedzi:

1 dla odpowiedzi № 1

Myślę, że potrzebowałbyś funkcji analitycznej OPÓŹNIENIE(). Za pomocą tej funkcji można uzyskać wartość poprzedniego wiersza (lub NULL, jeśli jest to pierwszy wiersz), aby można było sprawdzić, czy wartość w poprzednim wierszu jest inna, czy nie, i odpowiednio filtrować.

Nie jestem zaznajomiony z Vertica, ale powinna to być poprawna dokumentacja dla niego: https://my.vertica.com/docs/7.0.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Analytic/LAGAnalytic.htm

Wypróbuj poniższe zapytanie, powinno to zrobić:

SELECT l.Code, l.A, l.B, l.C, l.Date, l.ID
FROM (SELECT t.*,
LAG(t.C, 1) OVER (PARTITION BY t.Code, t.A ORDER BY t.Date) prev_val
FROM table_1 t) l
WHERE l.C != l.prev_val
OR l.prev_val IS NULL
ORDER BY l.Code, l.A, l.Date