Dzien dobry
Mam zagwozdke odnosnie problemu nr 1211. Pisze w oraclu:
https://leetcode.com/problems/queries-quality-and-percentage/description/
-
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..
-
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
- 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:
- CASE przyjmuje wartosc 1 z 3 iteracji(?) dla kotow
- CASE przyjmuje wartosc 1 z 3 iteracji(?) dla psow
- 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)