Dlaczego funkcje analityczne poprawiają wydajność zapytań SQL?

Поделиться
HTML-код
  • Опубликовано: 3 июл 2024
  • ✅Czy wiesz czym różnią się funkcje analityczne(funkcje okienkowe) od funkcji agregujących/grupujących(GROUP BY)? Te pierwsze nie tylko pozwalają nam na wyliczanie zagregowanych wartości bez grupowania rekordów. Są również świetną metodą optymalizacji zapytań SQL. Dlaczego? Zapraszam do odcinka po szczegóły.
    🎁 ODBIERZ PREZENTY
    1) Książka o tym, jak się przebranżowić na bazodanowca: promo.podstawybazdanych.pl/
    2) Lista najczęstszych błędach programistów PL/SQL: promo.plsql.pl/
    == 🔗 Przydatne linki z nagrania:==
    📥kod z lekcji do pobrania: drive.google.com/file/d/1RMjW...
    🏷️Łączenie tabel w SQL: • Łączenie tabel SQL, cz...
    🏷️Funkcje agregujące: • Kurs SQL 10: Grupowani...
    🏷️Funkcje analityczne: • Kurs SQL 22: Funkcje a...
    == 👌 Polecam obejrzeć:==
    1. Ścieżki dostępu do danych w SQL: • Jak przyśpieszyć zapyt...
    2. Co to jest widok SQL? • Czym są widoki w sql? #64
    == ⏱️ Plan odcinka:==
    00:00 wprowadzenie do odcinka
    01:05 funkcja agregująca vs funkcja analityczna
    02:29 wykonanie skryptu SQL (DDL)
    03:25 przykład 1
    10:04 przykład 2
    13:26 funkcja agregująca vs analityczna - porównanie
    #bazodanowiec
    == 👨‍💻 Poznaj mniej lepiej:==
    * Moja strona: www.nieinformatyk.pl/
    * Facebook: / nieinformatyk
    * Linkedin: / darekbutkiewicz
    * Instagram: / nieinformatyk
    * Twitter: / nieinformatyk
    Zasubskrybuj mój kanał: ruclips.net/user/nieinformatyk...
    🏁 Witaj na moim kanale :)
    Jestem programistą baz danych Oracle oraz developerem hurtownii danych (ETL). W tym miejscu dzielę się z oglądającymi wiedzą dotyczącą relacyjnych baz danych, praktycznych technik pisania SQL oraz optymalizacji kodu PL/SQL. Jeśli chcesz zdobyć praktyczną i rzetelną więdzę o bazach danych to trafiłeś na właściwe miejsce.
    🚨 Więcej informacji o bazach danych znajdziesz na www.nieinformatyk.pl
    📧 Masz pytanie, prośbę, sugestię? Pisz śmiało na kontakt@nieinformatyk.pl
  • НаукаНаука

Комментарии • 44

  • @coTyNiePowiesz
    @coTyNiePowiesz Год назад +1

    👍dziękuję Darku za możliwość nauki.

  • @marcinn7518
    @marcinn7518 5 месяцев назад

    Dzięki za ten film

    • @nieinformatyk
      @nieinformatyk  5 месяцев назад

      A ja dziękuję za komentarz :)

  • @Stanislaw_Nowak
    @Stanislaw_Nowak Год назад

    Można praktycznie nigdy nie grupować, i używać funkcji analitycznych z 'SELECT DISTINCT'. Np. 'SELECT DISTINCT departament_id, ROUND(AVG(salary) OVER (PARTITION BY departament_id), 2) AS avg_sal FROM pracownicy'. Wyjątkiem jest STRING_AGG (LIST_AGG), która nie działa jako funkcja anlityczna.

  • @darthmichau878
    @darthmichau878 7 месяцев назад

  • @Stanislaw_Nowak
    @Stanislaw_Nowak Год назад

    A ja mam zagadke, jak przerobic poniższy kod by laczyc sie raz z tabela y. Mi sie to udalo, ale wydajnosc spadla i nie wiem czemu.
    Select
    X.id,
    A.data as a_data,
    B.data as b_data,
    C.data as c_data
    From
    X
    Outer apply
    (Select top 1 data
    From y
    Where y.id=x.id and typ='a'
    Order by data desc) as a
    Outer apply
    (Select top 1 data
    From y
    Where y.id=x.id and typ='b'
    Order by data desc) as b
    Outer apply
    (Select top 1 data
    From y
    Where y.id=x.id and typ='c'
    Order by data desc) as c

    • @nieinformatyk
      @nieinformatyk  Год назад

      o coś takiego chodziło?
      WITH q1 AS (
      SELECT x.typ
      , x.data
      , ROW_NUMBER() OVER (PARTITION BY x.typ ORDER BY x.data DESC) AS lp
      FROM x
      LEFT JOIN y
      ON y.id=x.id
      WHERE x.typ IN ('a', 'b', 'c')
      )
      SELECT x.id
      , CASE
      WHEN x.typ = 'a' THEN x.data
      ELSE NULL
      END as a_data
      , CASE
      WHEN x.typ = 'b' THEN x.data
      ELSE NULL
      END as b_data
      , CASE
      WHEN x.typ = 'c' THEN x.data
      ELSE NULL
      END as c_data
      FROM q1
      WHERE lp = 1
      ;

    • @Stanislaw_Nowak
      @Stanislaw_Nowak Год назад

      @@nieinformatyk trochę wprowadziłem w błąd nie dając aliasów, chodziło o :
      Select
      x.id,
      a.data as a_data,
      b.data as b_data,
      c.data as c_data
      From
      x
      Outer apply
      (Select top 1 y.data
      From y
      Where y.id=x.id and y.typ='a'
      Order by y.data desc) as a
      Outer apply
      (Select top 1 y.data
      From y
      Where y.id=x.id and y.typ='b'
      Order by y.data desc) as b
      Outer apply
      (Select top 1 y.data
      From y
      Where y.id=x.id and y.typ='c'
      Order by y.data desc) as c

    • @nieinformatyk
      @nieinformatyk  Год назад

      @@Stanislaw_Nowak nie testowałem kodu, ale wydaje mi się, że moje rozwiązanie wyżej powinno działać, sprawdzałeś? Coś przeoczyłem?

    • @Stanislaw_Nowak
      @Stanislaw_Nowak Год назад

      Dajesz x.typ, a typ jest w tabeli y

    • @nieinformatyk
      @nieinformatyk  Год назад

      @@Stanislaw_Nowak to zamień x.typ na y.typ - to pseudokod(literówki mogą tam być) :) Konceptualnie wygląda na te same polecenie.

  • @TomaszTomzik
    @TomaszTomzik Год назад

    No ale jak będziesz miał kilka osób z tą samą stawką i będzie to stawka minimalna, to opcja zrobienia za pomocą RANK nie zadziała, bo też zwróci tylko jednego pracownika.

    • @nieinformatyk
      @nieinformatyk  Год назад

      Dlaczego? RANK dla kilku rekordów przypisze wartość 1. Chyba pomyliłeś RANK z ROW_NUMBER :)

    • @TomaszTomzik
      @TomaszTomzik Год назад

      @@nieinformatyk a to pomyliłem faktycznie, sory złote jęzory... To przecież RANK!

  • @KS2416
    @KS2416 Год назад

    Witam. Używam my SQL Workbrench i w ogóle nie mam funkcji okienkowych. Jak wpisuje traktuje jako zwykły tekst. Ktoś wie cosie dzieje?

    • @nieinformatyk
      @nieinformatyk  Год назад

      Coś kłamiesz :) w Mysql funkcje analityczne działają tak jak w Oracle i innych RDBMS: dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

    • @KS2416
      @KS2416 Год назад

      @@nieinformatyk No ale mi nie działają. Row_number, over itd.

    • @nieinformatyk
      @nieinformatyk  Год назад

      @@KS2416 pokaż komunikat błędu

    • @KS2416
      @KS2416 Год назад

      @@nieinformatyk Poakzuje mi syntax error, ale mi workbrench nie uznaje w ogóle tego za funkcje. Nie zmienia koloru itd. Nie wiem, może coś w ustawieniach muszę zmienić?

    • @KS2416
      @KS2416 Год назад

      @@nieinformatyk Podobnie mam z except, intersept i funkcją datediff

  • @biohacker5815
    @biohacker5815 Год назад

    Można zostać programistą bez informatycznego wykształcenia?

    • @nieinformatyk
      @nieinformatyk  Год назад +1

      pewnie :)

    • @tomnap2328
      @tomnap2328 Год назад +1

      Można. Ja zostałem w wieku 40 lat. Na rozmowie miałem pytanie, które było omawiane na tym kanale:)

  • @imomaikel
    @imomaikel Год назад

    nie chcesz może opowiedzieć jak wyglądały studia na wacie?

    • @nieinformatyk
      @nieinformatyk  Год назад +1

      studiowałem zarządzanie, więc nie sądzę by Cię to interesowało :) fajni ludzie, fajne akademiki, dobre imprezy na kampusie :)

  • @TomaszTomzik
    @TomaszTomzik Год назад

    Boli mnie często, że niestety w SQLach nie można odwoływać się do wyliczonych kolumn w tym samym selekcie (na tym samym poziomie), np. po aliasie... trzeba robić podzapytania, jak się pytam CZEMU?:D . Np: select id_pracownika, netto * 1.23 as brutto, brutto + nagroda as brutto_z_nagroda from PLACE.

    • @Arogancky
      @Arogancky Год назад

      eee
      select
      1+1 as wynik
      ,wynik/2 as wynik2
      ,wynik+wynik2 as wynik3
      działa, przynajmniej w snowflake, SQLServera mi sie nie chce odpalać nawet

    • @nieinformatyk
      @nieinformatyk  Год назад

      @@Arogancky w Oracle nie zadziała :) Sql Server raczej też

    • @TomaszTomzik
      @TomaszTomzik Год назад

      @@Arogancky nie ma czegoś takiego w ORACLE.... ani MSSQL

    • @Arogancky
      @Arogancky Год назад

      @@nieinformatyk a, to dlatego nie lubiłem tych systemów :D

  • @TomaszTomzik
    @TomaszTomzik Год назад

    Zrobiłeś już serię odcinków o przykładowych zastosowaniach wszystkich funkcji analitycznych? (tfu. co za nazwa)

    • @nieinformatyk
      @nieinformatyk  Год назад

      Nie, nie nagrywałem takiego odcinka. Tfu? Jaką nazwę preferujesz?

    • @TomaszTomzik
      @TomaszTomzik Год назад

      @@nieinformatyk bez "anal" ;)

  • @jankowalszczak2689
    @jankowalszczak2689 Год назад

    merytorycznie ok ale proszę mniej klikania, odklikiwania zaznaczania bez sensu. wszyscy widzą a tylko rozprasza i drażni. w każdym filmie to samo - taka trochę droga przez mękę aby dooglądać do końca.

    • @nieinformatyk
      @nieinformatyk  Год назад +1

      Dzięki za komentarz :) To pierwsza sugestia tego typu i nie wiem czy innym nie chciało się komentować czy może tylko Tobie to przeszkadza. Osobiście wydaje mi się, że jak ktoś nie zna SQL to zaznaczenie fragmentu kodu myszką ułatwia jego zrozumienie, bo wiadomo o której z linijek rozmawiamy.

  • @TomaszTomzik
    @TomaszTomzik Год назад +2

    Kobiety i Mężczyźni? ojoj... nie narazisz się tym ludziom "od alfabetu" za tak wąskie potraktowanie płci? :)

    • @nieinformatyk
      @nieinformatyk  Год назад

      Może poza Tobą nikt nie zauważy :)

    • @TomaszTomzik
      @TomaszTomzik Год назад

      @@nieinformatyk oj zdziwiłbyś się przy meinstreamowych zasięgach...