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 № 1Myś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