Prośba o wyjaśnienie rozwiązania zadania nr 1211 z LeetCode

0

Dzien dobry

Mam zagwozdke odnosnie problemu nr 1211. Pisze w oraclu:
https://leetcode.com/problems/queries-quality-and-percentage/description/

  1. Po licznych perturbacjach zajrzalem do rozwiazan i potrzebuje wytlumaczenia. Mianowicie nie rozumiem jak w 3 linijce poor_query_percantage WHEN rating jest nizszy niz 3, przyjmuje on wartosc 1. W tabeli wejsciowych danych jest 6 recordow, z ktorych 2 spelniaja warunek 1/3 dla kotow, 1/3 dla psow. I tutaj nie rozumiem. Jesli wyrazenie CASE zliczy mi 2 z 6 wartosci i przemnozy przez 100 po czym wyciagnie z tego funkcje AVG to czuje sie mocno zagubiony w zrozumieniu co gdzie sie sumuje, mnozy, dodaje etc..

  2. Alternatywnie rozkminilem troche inne rozwiazanie dla tej samej linijki, ale wciaz tego wyrazenia CASE nie rozumiem.

    ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END)/COUNT(*) * 100, 2) AS poor_query_percentage
    

Rozwiazanie:

SELECT query_name, 
ROUND(AVG((rating) / position), 2)  AS quality,
ROUND(AVG(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100, 2) AS poor_query_percentage 
FROM Queries  
GROUP BY query_name
;

Pozdrawiam hazello

0
hazello napisał(a):

Dzien dobry

Mam zagwozdke odnosnie problemu nr 1211. Pisze w oraclu:
https://leetcode.com/problems/queries-quality-and-percentage/description/

  1. Po licznych perturbacjach zajrzalem do rozwiazan i potrzebuje wytlumaczenia. Mianowicie nie rozumiem jak w 3 linijce poor_query_percantage WHEN rating jest nizszy niz 3, przyjmuje on wartosc 1. W tabeli wejsciowych danych jest 6 recordow, z ktorych 2 spelniaja warunek 1/3 dla kotow, 1/3 dla psow. I tutaj nie rozumiem. Jesli wyrazenie CASE zliczy mi 2 z 6 wartosci i przemnozy przez 100 po czym wyciagnie z tego funkcje AVG to czuje sie mocno zagubiony w zrozumieniu co gdzie sie sumuje, mnozy, dodaje etc..

  2. Alternatywnie rozkminilem troche inne rozwiazanie dla tej samej linijki, ale wciaz tego wyrazenia CASE nie rozumiem.

    ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END)/COUNT(*) * 100, 2) AS poor_query_percentage
    

Rozwiazanie:

SELECT query_name, 
ROUND(AVG((rating) / position), 2)  AS quality,
ROUND(AVG(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100, 2) AS poor_query_percentage 
FROM Queries  
GROUP BY query_name
;

Pozdrawiam hazello

  1. Zwróć uwagę, że zapytanie jest grupowane dla dla query_name - stąd kwerenda nie liczy 2 rekordów z 6, tylko raz liczy 1 rekord z 3 dla psów, a później 1 rekord z 3 dla kotów.
    pod linikiem który wkleiłeś jest jeszcze informacja "This table may have duplicate rows." Jeśli chciałbyś wartości unikatowe to należałoby użyć Select Distinct.

Spróbuj dla testu wyrzucić z kwerendy "GROUP BY" i popatrz na wynik.

0
TytusRomek napisał(a):
hazello napisał(a):

Dzien dobry

Mam zagwozdke odnosnie problemu nr 1211. Pisze w oraclu:
https://leetcode.com/problems/queries-quality-and-percentage/description/

  1. Po licznych perturbacjach zajrzalem do rozwiazan i potrzebuje wytlumaczenia. Mianowicie nie rozumiem jak w 3 linijce poor_query_percantage WHEN rating jest nizszy niz 3, przyjmuje on wartosc 1. W tabeli wejsciowych danych jest 6 recordow, z ktorych 2 spelniaja warunek 1/3 dla kotow, 1/3 dla psow. I tutaj nie rozumiem. Jesli wyrazenie CASE zliczy mi 2 z 6 wartosci i przemnozy przez 100 po czym wyciagnie z tego funkcje AVG to czuje sie mocno zagubiony w zrozumieniu co gdzie sie sumuje, mnozy, dodaje etc..

  2. Alternatywnie rozkminilem troche inne rozwiazanie dla tej samej linijki, ale wciaz tego wyrazenia CASE nie rozumiem.

    ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END)/COUNT(*) * 100, 2) AS poor_query_percentage
    

Rozwiazanie:

SELECT query_name, 
ROUND(AVG((rating) / position), 2)  AS quality,
ROUND(AVG(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100, 2) AS poor_query_percentage 
FROM Queries  
GROUP BY query_name
;

Pozdrawiam hazello

  1. Zwróć uwagę, że zapytanie jest grupowane dla dla query_name - stąd kwerenda nie liczy 2 rekordów z 6, tylko raz liczy 1 rekord z 3 dla psów, a później 1 rekord z 3 dla kotów.
    pod linikiem który wkleiłeś jest jeszcze informacja "This table may have duplicate rows." Jeśli chciałbyś wartości unikatowe to należałoby użyć Select Distinct.

Spróbuj dla testu wyrzucić z kwerendy "GROUP BY" i popatrz na wynik.

Nie moge wyrzucic GROUP BY, gdyz w SELECT uzywam funkcji agregujacych. Co do 1. to teraz rozumiem, ze liczy raz tak, rak siak, ale wciaz nie czaje skad pojawiaja sie wartosci procentowe. Moze przedstawie moj sposob rozkminy i poprosze o korekte:

  1. CASE przyjmuje wartosc 1 z 3 iteracji(?) dla kotow
  2. CASE przyjmuje wartosc 1 z 3 iteracji(?) dla psow
  3. komputerek oblicza AVG(1/3) *100 raz dla kotow, raz dla psow, pozniej zaokragla itd.
    W punkcie nr 3 wiem, ze zle rozumuje i tutaj w tym miejscu poprosilbym o jakas marchewke, ktorej moglbym sie zaczepic i wykminic motyw.
0
hazello napisał(a):
TytusRomek napisał(a):
hazello napisał(a):

Dzien dobry

Mam zagwozdke odnosnie problemu nr 1211. Pisze w oraclu:
https://leetcode.com/problems/queries-quality-and-percentage/description/

  1. Po licznych perturbacjach zajrzalem do rozwiazan i potrzebuje wytlumaczenia. Mianowicie nie rozumiem jak w 3 linijce poor_query_percantage WHEN rating jest nizszy niz 3, przyjmuje on wartosc 1. W tabeli wejsciowych danych jest 6 recordow, z ktorych 2 spelniaja warunek 1/3 dla kotow, 1/3 dla psow. I tutaj nie rozumiem. Jesli wyrazenie CASE zliczy mi 2 z 6 wartosci i przemnozy przez 100 po czym wyciagnie z tego funkcje AVG to czuje sie mocno zagubiony w zrozumieniu co gdzie sie sumuje, mnozy, dodaje etc..

  2. Alternatywnie rozkminilem troche inne rozwiazanie dla tej samej linijki, ale wciaz tego wyrazenia CASE nie rozumiem.

    ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END)/COUNT(*) * 100, 2) AS poor_query_percentage
    

Rozwiazanie:

SELECT query_name, 
ROUND(AVG((rating) / position), 2)  AS quality,
ROUND(AVG(CASE WHEN rating < 3 THEN 1 ELSE 0 END) * 100, 2) AS poor_query_percentage 
FROM Queries  
GROUP BY query_name
;

Pozdrawiam hazello

  1. Zwróć uwagę, że zapytanie jest grupowane dla dla query_name - stąd kwerenda nie liczy 2 rekordów z 6, tylko raz liczy 1 rekord z 3 dla psów, a później 1 rekord z 3 dla kotów.
    pod linikiem który wkleiłeś jest jeszcze informacja "This table may have duplicate rows." Jeśli chciałbyś wartości unikatowe to należałoby użyć Select Distinct.

Spróbuj dla testu wyrzucić z kwerendy "GROUP BY" i popatrz na wynik.

Nie moge wyrzucic GROUP BY, gdyz w SELECT uzywam funkcji agregujacych. Co do 1. to teraz rozumiem, ze liczy raz tak, rak siak, ale wciaz nie czaje skad pojawiaja sie wartosci procentowe. Moze przedstawie moj sposob rozkminy i poprosze o korekte:

  1. CASE przyjmuje wartosc 1 z 3 iteracji(?) dla kotow
  2. CASE przyjmuje wartosc 1 z 3 iteracji(?) dla psow
  3. komputerek oblicza AVG(1/3) *100 raz dla kotow, raz dla psow, pozniej zaokragla itd.
    W punkcie nr 3 wiem, ze zle rozumuje i tutaj w tym miejscu poprosilbym o jakas marchewke, ktorej moglbym sie zaczepic i wykminic motyw.

Możesz wyrzucić, użyłem skrótu myślowego.
chodziło mi rozpisanie w szczegółach, zrobisz sobie podkwerendę (piszę z "ręki" więc może być coś ze składnią):

SELECT query_name,
CASE WHEN rating < 3 THEN 1 ELSE 0 END AS poor_query_percentage
FROM Queries

w wyniku powinieneś otrzymać 6 wierszy. 1 oznacza Twój warunek.
teraz jeśli z tej podkwerendy zrobisz kolejną z grupowaniem i funkcjami agregującymi, to wyjdziesz na pierwotny wynik, ale moze będzie bardziej czytelnie.

a tutaj może jaśniej dla Twojego rozwiązania z pierwszego posta:
Komputerek liczy dla psów kolejne rekordy i wyniku dla pierwszego wiersza dostaje 0 (5>3), dla drugiego wiersza dostaje 0 (5>3), a dla trzeciego 1 bo spełnił się warunek (1<3.) więc dalej robi sumę (0+0+1 = 3).
A dalej liczy się średnia dla 3 wierszy (są grupowane, ale nadal są 3). Więc mamy sumę równą 1 dla 3 pojedynczych wierszy.
Średnia dla jednego wiersza to wiadomo 1/3 = 0,33
Jak pomnożysz to mamy procent.

Twoja propozycja Count() też była ok, ale to zawsze kolejne obliczenia, a ewentualnie gdybyś nie miał czego liczyć (czyli count() zwrociłby 0, to pewnie wywaliłoby jakiś błąd)

1 użytkowników online, w tym zalogowanych: 0, gości: 1