Lekcje modułu (4/4)
Przesunięcia: LAG i LEAD
Zmiany: LAG i LEAD
W przypadku danych sekwencyjnych i czasowych często zachodzi potrzeba porównania bieżącego wiersza z wierszem z poprzedniego dnia. W „standardowym” SQL wymaga to bardzo niebezpiecznych (i bardzo wolnych) samozłączeń.
Funkcje LAG() (poprzedni wiersz) i LEAD() (następny wiersz) rozwiązują dokładnie ten problem z niezwykłą zwinnością i elegancją.
Patrząc w przeszłość i przyszłość
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;W przykładzie każdy wiersz będzie wygodnie zawierał ilość wyprodukowaną przez tę samą tabelę, przesuniętą o jeden wiersz do przodu (do tyłu w czasie). Możemy łatwo odjąć total_amount - LAG(...), aby obliczyć różnicę lub zmiany procentowe z miesiąca na miesiąc!
Podobnie LEAD() pobierze wartość z wiersza znajdującego się tuż pod bieżącym.
Z tabeli „produkty” wyodrębnij „id”, „launched_on”, „cena” i dodaj „prev_price”, tj. „cenę” produktu logicznie uważaną za „poprzedni”, w rosnącej kolejności „launched_on”.
Pokaż wskazówkę
Użyj LAG(cena) OVER(ZAMÓW PRZEZ uruchomienie_na ASC)
Rozwiązanie dostępne po 3 próbach
Jak obliczysz skoki ocen na indywidualnego użytkownika? Zasymuluj to: z tabeli „recenzje” wyodrębnij „customer_id”, „created_at”, „rating” i „next_rating” (następna recenzja tego samego klienta w określonym czasie). Zatem podziel według „customer_id”, zamów według „created_at” i użyj odpowiedniej funkcji okna, aby zajrzeć do przodu.
Pokaż wskazówkę
LEAD() razem z PARTITION BY i ORDER BY w OVER.
Rozwiązanie dostępne po 3 próbach