SQL zaawansowany - CTE, funkcje okienkowe, wydajność

CTE, ROW_NUMBER kontra RANK, LAG, optymalizacja zapytań. Teoria pod realne zadania analityczne — poziom rozmowy o pracę na mid+.

SQL 14 pytan Prog zaliczenia: 70%
Rozwiąż za darmo - załóż konto Mam konto

Przykładowe pytania z tego testu

1. Analizujesz tabelę `orders(order_id, customer_id, order_value, order_date)`. Chcesz przypisać każdemu zamówieniu numer kolejny w obrębie klienta, posortowany od najnowszego, tak aby zamówienia z identyczną datą dostały różne, kolejne numery (bez dziur). Której funkcji okienkowej użyjesz?

  • `ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC)`
  • `RANK() OVER (PARTITION BY customer_id ORDER BY order_date DESC)`
  • `DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY order_date DESC)`
  • `ROW_NUMBER() OVER (ORDER BY order_date DESC)`

2. Czym różni się wynik `RANK()` od `DENSE_RANK()`, gdy w sortowaniu występują remisy (np. dwóch klientów ma ten sam obrót)?

  • `RANK()` pozostawia dziury w numeracji po remisie, a `DENSE_RANK()` numeruje bez dziur
  • `DENSE_RANK()` pozostawia dziury (1,1,3), a `RANK()` numeruje bez dziur (1,1,2)
  • Obie funkcje zawsze dają identyczny wynik, różni je wyłącznie nazwa funkcji
  • `RANK()` ignoruje remisy i przypisuje każdemu wierszowi zupełnie inny numer

3. Chcesz policzyć sumę kroczącą (narastający obrót) klienta od jego pierwszego zamówienia do bieżącego wiersza, sortując po dacie. Które zapisy klauzuli okna dają poprawną sumę kroczącą narastającą? (zaznacz wszystkie poprawne)

  • `SUM(order_value) OVER (PARTITION BY customer_id ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`
  • `SUM(order_value) OVER (PARTITION BY customer_id ORDER BY order_date)`
  • `SUM(order_value) OVER (PARTITION BY customer_id)`
  • `SUM(order_value) OVER (PARTITION BY customer_id ORDER BY order_date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)`

To 3 z 14 pytań. Załóż darmowe konto, aby rozwiązać cały test i zobaczyć wynik z wyjaśnieniami.