@@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ć?
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
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 ;
@@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 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 )
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.
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.
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.
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 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ą.
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.
Pierwszy raz słyszę o funkcjach analitycznych i pierwszy raz widzę opcję Explain Plan. Bardzo fajna sprawa! Dzięki! :)
Czyli materiał odpowiedni dla Ciebie, jeśli ilość nowych rzeczy Cię nie przytłacza :)
👍dziękuję Darku za możliwość nauki.
proszę Cię bardzo :)
Dzięki za ten film
A ja dziękuję za komentarz :)
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?
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
@@nieinformatyk No ale mi nie działają. Row_number, over itd.
@@KS2416 pokaż komunikat błędu
@@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ć?
@@nieinformatyk Podobnie mam z except, intersept i funkcją datediff
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
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
;
@@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
@@Stanislaw_Nowak nie testowałem kodu, ale wydaje mi się, że moje rozwiązanie wyżej powinno działać, sprawdzałeś? Coś przeoczyłem?
Dajesz x.typ, a typ jest w tabeli y
@@Stanislaw_Nowak to zamień x.typ na y.typ - to pseudokod(literówki mogą tam być) :) Konceptualnie wygląda na te same polecenie.
Czy funkcje analityczne to to samo co funkcje okienkowe (window functions)?
Tak, to dokładnie jedno i to samo :)
@@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 )
Można zostać programistą bez informatycznego wykształcenia?
pewnie :)
Można. Ja zostałem w wieku 40 lat. Na rozmowie miałem pytanie, które było omawiane na tym kanale:)
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.
Dlaczego? RANK dla kilku rekordów przypisze wartość 1. Chyba pomyliłeś RANK z ROW_NUMBER :)
@@nieinformatyk a to pomyliłem faktycznie, sory złote jęzory... To przecież RANK!
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.
DISTINCT to funkcja grupująca :)
nie chcesz może opowiedzieć jak wyglądały studia na wacie?
studiowałem zarządzanie, więc nie sądzę by Cię to interesowało :) fajni ludzie, fajne akademiki, dobre imprezy na kampusie :)
Zrobiłeś już serię odcinków o przykładowych zastosowaniach wszystkich funkcji analitycznych? (tfu. co za nazwa)
Nie, nie nagrywałem takiego odcinka. Tfu? Jaką nazwę preferujesz?
@@nieinformatyk bez "anal" ;)
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.
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.
Kobiety i Mężczyźni? ojoj... nie narazisz się tym ludziom "od alfabetu" za tak wąskie potraktowanie płci? :)
Może poza Tobą nikt nie zauważy :)
@@nieinformatyk oj zdziwiłbyś się przy meinstreamowych zasięgach...
@@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ą.
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.
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
@@Arogancky w Oracle nie zadziała :) Sql Server raczej też
@@Arogancky nie ma czegoś takiego w ORACLE.... ani MSSQL
@@nieinformatyk a, to dlatego nie lubiłem tych systemów :D