funkcja MAX i GROUP BY

0

Witam
Jestem początkujący w sql dlatego prosiłbym o wyrozumiałość a więc do rzeczy.
Problem dotyczy jednej tabeli "Komputer" w której są takie kolumny jak model, cena, dysk, szybkość itp.

Chciałbym wyciągnąć z tego model i cenę z tym, że tylko z ceną najwyższą.
Próbowałem coś takiego ale zwraca mi wszystkie rekordy ;/

SELECT model, max(cena) as cena from Komputer
GROUP BY model

Pomoże ktoś jak się z tym uporać?

1

Przede wszystkim dobrze by bylo jakbys na przyszlosc podawal na jakiej bazie pracujesz. Idea jest taka, zeby posortowac dane malejaco po max(cena) a nastepnie pobrac tylko pierwszy wiersz. W MySQL powinno zadzialac co takiego:


SELECT model, max(cena) FROM `Komputer` 
GROUP BY model
ORDER BY max(cena) DESC
LIMIT 1

W innych dialektach spróbuj tak:


SELECT TOP 1 model, max(cena) as cena FROM `Komputer` 
GROUP BY model
ORDER BY max(cena) DESC

Jeżeli chcesz zwrócić wszystkie modele, które mają maksymalną cene (istnieje możliwość że kilka modeli będzie miało maksymalna cene jak służnie zauważył PawlakSocho) to albo skorzystaj z tego co zaproponowal PawlakSocho albo z alternatywy typu:


SELECT model, MAX(cena) as cena FROM `Komputer` 
WHERE cena = (SELECT max(cena) FROM `Komputer`) 
GROUP BY model

Jeżeli moje zapytanie i zaptanie uzytkownika PawlakSocho bedzie dawac identyczne wyniki to po prostu wybierz bardziej wydajne.

Swoja droga to warto byloby pomyslec nad przeprojektowaniem bazy. Generalnie bazy danych dobrze jest projektowac w taki sposob aby ograniczyc dublikaty. Jezeli w Twojej tabeli masz kilka cen dla jednego modelu (a chyba masz skoro uzywasz funkcji agregujacej max) to znaczy ze masz kilka wierszy z niepotrzebnie zdublikowanym modelem.

Podobna systuacja jest w przypadku dyskow. Jezeli w polu dysk masz informacje tylko o jego pojemnosci to jeszcze ujdzie. Natomiast jezeli masz tam informacje o modelu dysku to juz zaczyna byc niefajnie. Lepiej byloby to rozbic na dwie tabele (Komputery i Dyski). W tabeli komputer mialbys model komputera a w tabeli Dyski mialbys wszelkie informacje odnosnie dysku takie jak model, pojemnosc itd. Obie tabele oczywiscie powinny byc powiazane (poczytaj o relacjach, kluczach podstawowych i kluczach obcych).

1

Wszystkie rekordy z najwyższą ceną:

SELECT k.model, max_cena 
FROM (SELECT max(cena) max_cena 
     FROM komputer), 
     komputer k
WHERE k.cena = max_cena;
0
tk napisał(a):

Jeżeli chcesz zwrócić wszystkie modele, które mają maksymalną cene (istnieje możliwość że kilka modeli będzie miało maksymalna cene jak służnie zauważył PawlakSocho) to albo skorzystaj z tego co zaproponowal PawlakSocho albo z alternatywy typu:

SELECT model, MAX(cena) as cena FROM Komputer
WHERE cena = (SELECT max(cena) FROM Komputer)
GROUP BY model



TAK właśnie o to chodziło dzięki

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