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

Поділитися
Вставка
  • Опубліковано 24 січ 2025

КОМЕНТАРІ • 50

  • @Cayman91
    @Cayman91 5 місяців тому

    Pierwszy raz słyszę o funkcjach analitycznych i pierwszy raz widzę opcję Explain Plan. Bardzo fajna sprawa! Dzięki! :)

    • @nieinformatyk
      @nieinformatyk  5 місяців тому

      Czyli materiał odpowiedni dla Ciebie, jeśli ilość nowych rzeczy Cię nie przytłacza :)

  • @coTyNiePowiesz
    @coTyNiePowiesz 2 роки тому +1

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

  • @marcinn7518
    @marcinn7518 Рік тому

    Dzięki za ten film

  • @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

  • @Stanislaw_Nowak
    @Stanislaw_Nowak 2 роки тому

    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  2 роки тому

      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 2 роки тому

      @@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  2 роки тому

      @@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 2 роки тому

      Dajesz x.typ, a typ jest w tabeli y

    • @nieinformatyk
      @nieinformatyk  2 роки тому

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

  • @ryzumaster
    @ryzumaster 5 місяців тому

    Czy funkcje analityczne to to samo co funkcje okienkowe (window functions)?

    • @nieinformatyk
      @nieinformatyk  5 місяців тому +1

      Tak, to dokładnie jedno i to samo :)

    • @ryzumaster
      @ryzumaster 5 місяців тому

      @@nieinformatyk czy w tym drugim przykładzie możemy użyć zamiast funkcji rank( ) funkcje row_number? czy otrzymamy wtedy takie same wyniki?
      with p_rank as (select p.*, row_number() over (order by p.salary asc)
      as lp from pracownicy p )

  • @biohacker5815
    @biohacker5815 2 роки тому

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

    • @nieinformatyk
      @nieinformatyk  2 роки тому +1

      pewnie :)

    • @tomnap2328
      @tomnap2328 2 роки тому +1

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

  • @TomaszTomzik
    @TomaszTomzik 2 роки тому

    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  2 роки тому

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

    • @TomaszTomzik
      @TomaszTomzik 2 роки тому

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

  • @Stanislaw_Nowak
    @Stanislaw_Nowak 2 роки тому

    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.

  • @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 2 роки тому

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

    • @nieinformatyk
      @nieinformatyk  2 роки тому

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

    • @TomaszTomzik
      @TomaszTomzik 2 роки тому

      @@nieinformatyk bez "anal" ;)

  • @darthmichau878
    @darthmichau878 Рік тому

  • @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 роки тому +2

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

    • @nieinformatyk
      @nieinformatyk  2 роки тому

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

    • @TomaszTomzik
      @TomaszTomzik 2 роки тому

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

    • @vastusassasin1070
      @vastusassasin1070 3 місяці тому

      @@TomaszTomzik Nie ma co się przejmować zdaniem kilku zjebów, którzy spali na lekcjach biologii śniąć do flaku kolegi z ławki w swojej japie. Disney i Ubisoft się teraz srogo o tym przekonują.

  • @TomaszTomzik
    @TomaszTomzik 2 роки тому

    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 2 роки тому

      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  2 роки тому

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

    • @TomaszTomzik
      @TomaszTomzik 2 роки тому

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

    • @Arogancky
      @Arogancky 2 роки тому

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