Kryterium ROWS i RANGE
Część sekcji Podstawy ścieżki SQL w Coddy. Lekcja 69 z 72.
Na razie nie możemy elastycznie wybierać, ile wierszy przed lub po uwzględnić. Teraz jest to możliwe dzięki kryteriom ROWS i RANGE. Aby ich użyć, piszemy:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
Możemy też określić następujące opcje:
CURRENT ROW– bieżący wierszn PRECEDING– wiersze przed bieżącym wierszemn FOLLOWING– wiersze po bieżącym wierszu
Różnica między ROWS a RANGE polega na tym, że kryterium ROWS nie uwzględnia wartości, a jedynie pozycje, podczas gdy RANGE definiuje okno za pomocą zakresów wartości, a nie pozycji wierszy.
W przypadku RANGE musimy określić ORDER BY --column_name--, ponieważ w przeciwnym razie nie wiedziałoby, jak wybrać okno.
Na przykład:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGTutaj tworzy okno obejmujące bieżący wiersz, poprzedni wiersz i następny wiersz.
ORDER BY levels
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWINGTworzy tu okno, które dla każdego poziomu (posortowanego rosnąco) obejmuje bieżący poziom, jeden poziom przed nim i jeden poziom po nim. Jeśli bieżący poziom to 5, okno obejmie poziomy 4, 5 i 6.
Uwaga: Użycie RANGE BETWEEN może skutkować uwzględnieniem większej liczby wierszy w oknie, ponieważ obejmuje wszystkie wiersze, które mają te same wartości co te w zakresie, podczas gdy ROWS BETWEEN zawsze uwzględnia tę samą liczbę wierszy (o ile są dostępne w zbiorze danych).
Ponadto w przypadku dat przechowywanych jako tekst (takich jak '2024-01-05') przesunięcie RANGE nie wykonuje żadnych obliczeń na datach: przy 1 PRECEDING okno obejmuje tylko wiersze z tą samą datą. Aby zliczać dni, sortuj według liczby, na przykład julianday(date).
Oto prosty przykład ilustrujący różnicę między ROWS a RANGE:
Użycie ROWS:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsKorzystanie z RANGE:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_rangeWyzwanie
ŁatwyDostępne tabele i kolumny:
newspapers:date,num_newspapers
W tym wyzwaniu mamy dane o gazetach przeznaczonych do produkcji. Chcemy poznać średnią liczbę gazet, które wydrukowano w ciągu dwóch dni przed bieżącym wierszem i jednego dnia po nim. Chcemy też poznać różnicę między maksymalną a minimalną liczbą gazet wydrukowanych w bieżącym dniu i w ciągu trzech poprzedzających go dni. Nazwij te kolumny odpowiednio avg_newspapers i diff_newspapers.
Spróbuj swoich sił
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
4Więcej słów kluczowych
Słowo kluczowe INSłowo kluczowe BETWEENSłowo kluczowe LIKESłowo kluczowe ASPowtórzenie – modele telefonów komórkowych2Instrukcje warunkowe
Podstawy instrukcji warunkowychSłowo kluczowe ANDSłowo kluczowe ORSłowo kluczowe NOTŁączenie wielu warunkówNawiasyWartości logiczne3Określony format zwracanych danych
Wartości nullSortowanie wyników — część 1Sortowanie wyników — część 2Powtórzenie — firma zajmująca się cyberbezpieczeństwemOgraniczanie liczby rekordówPowtórzenie — fabryka pojazdów6Wyzwania na początek
Powtórka – wybory parlamentarnePowtórka – zatrzymanie przestępcy przez policjęPowtórka – pojemnik na napój w barzePowtórka – inżynier: nowe kolumny9Wiele tabel
Podstawowe JOIN — część 1Podstawowe JOIN — część 2Powtórka — JOINSamozłączeniePowtórka — samozłączenieUNIONUprość zapytania — słowo kluczowe WITHPowtórka — zapytania WITHPowtórka — wykonawca z branży nieruchomości12Funkcje okna część 2
Funkcje RANK i DENSE_RANKPowtórzenie – RANK i DENSE_RANKFunkcja NTILEFunkcje agregująceKryterium ROWS i RANGEPoćwicz samodzielnie: Edytor online SQL