MAX einer Spalte
nerodrom
- datenbank
Hallo,
ich hab wahrscheinlich ein sehr triviales Problem.
Ich suche die ID eines Maximums.
Kleines Beispiel
ID|Summe
01|12
02|18
03|12
(Diese Tabelle wird erst durch dir GroupBy-Funktion erstellt!)
Die Lösung soll also ID = 2 sein.
Mein derzeitiger Versuch schaut so aus. Funktioniert jedoch nicht!
SELECT Summe1.ID
FROM
(select r2.FK_id as ID, sum(r2.ranking) as Ranking
from ranking r2
group by r2.FK_id) Summe1,
(select r3.FK_id as ID, sum(r3.ranking) as Ranking
from ranking r3
group by r3.FK_id) Summe2
WHERE Max(Summe1.Ranking) = Max(Summe2.Ranking);
yo,
SELECT Summe1.ID
FROM
(select r2.FK_id as ID, sum(r2.ranking) as Ranking
from ranking r2
group by r2.FK_id) Summe1,
(select r3.FK_id as ID, sum(r3.ranking) as Ranking
from ranking r3
group by r3.FK_id) Summe2
WHERE Max(Summe1.Ranking) = Max(Summe2.Ranking);
ersten wills du sicher nicht das kreuzprodukt beider tabellen (unterabfragen), sondern eher ein UNION ALL und selbst das scheint mir überflüssig zu sein.
SELECT r1.id
FROM raking r1
WHERE (SELECT SUM(r2.raking) FROM raking r2 WHERE r1.id = r2.id)
=
(SELECT MAX(tab1.summen)
FROM (SELECT sum(r3.ranking) as Summen FROM ranking r3 GROUP BY r3.FK_id
) tab1
)
Ilja
SELECT r1.id
FROM raking r1
WHERE (SELECT SUM(r2.raking) FROM raking r2 WHERE r1.id = r2.id)
=
(SELECT MAX(tab1.summen)
FROM (SELECT sum(r3.ranking) as Summen FROM ranking r3 GROUP BY r3.FK_id
) tab1
)Ilja
Hallo Ilja,
zunächst vielen, vielen Dank!!!
Das Statement liefert gleich 4mal die Lösung?! Habs es erst einmal mit distinct unterbunden. Werde gleich mit dieser Lösung weiterarbeiten.
Beste Grüße nerodrom
yo,
zunächst vielen, vielen Dank!!!
gerne geschehen...
Das Statement liefert gleich 4mal die Lösung?! Habs es erst einmal mit distinct unterbunden. Werde gleich mit dieser Lösung weiterarbeiten.
jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.
Ilja
jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.
Ilja
Also für einen Anfänger doch nicht sooo trivial!! ;-)
/nerodrom
yo,
jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.
Also für einen Anfänger doch nicht sooo trivial!! ;-)
yepp scheint so, dass ich noch ein anfänger bin ;-)
Ilja
Die Anforderung:
ich hab wahrscheinlich ein sehr triviales Problem.
Ich suche die ID eines Maximums.Kleines Beispiel
ID|Summe
01|12
02|18
03|12(Diese Tabelle wird erst durch dir GroupBy-Funktion erstellt!)
Die Lösung soll also ID = 2 sein.
(Das Datenfeld 'ID' bezeichnet also hier überraschenderweise keine Identity, also keine Eindeutigkeit. Demzufolge missfällt uns entweder der Datenfeldname 'ID' und/oder das Datendesign.)
(RDBMS ungenannt, Anforderungslage also möglicherweise dynamischer als erforderlich. => Bei Fragen Konzepte betreffend (hier der Fall) und bei Fragen, die Probleme betreffen, immer möglichst vollständige Angaben machen, werter Fragesteller!)
Lösungsvorschläge:
select top 1
[id],
count(*) as 'Summe'
from
DT_1
group by
[id]
order by summe desc
(Funktioniert mit T-SQL, also mit MS SQL Server.)
select
id,
count(*) as 'Summe'
from
DT_1
group by
[id]
order by summe desc
limit
0, 1
(Funktioniert - soweit http://dev.mysql.com/doc/refman/5.1/de/select.html zu trauen ist - unter MySQL 5.1 (und vermutlich mit allen Versionen))
Wenn die Daten nicht in DT_1 ("Datatable 1") liegen, sondern per Abfrage erst einmal zu ermitteln sind, bspw. aus einer DT_2 mit den Datensätzen:
ID|ranking
1|5
2|3
3|5
1|5
2|8
3|1
1|4
So schlagen wir ein
SELECT TOP 1
[id],
Summe
FROM
(
select
[id],
sum(ranking) as 'Summe'
from
DT_2
group by
[id]
) DT_1
GROUP BY
[id],
Summe
ORDER BY
Summe DESC
vor; funktioniert mit MS SQL Server SQL, für MySQL die SELECT-Syntax wie oben beschrieben anpassen.
Allerdings spricht unseres Erachtens nichts gegen:
SELECT TOP 1
[id],
sum(ranking) as 'Summe'
FROM
DT_2
GROUP BY
[id]
ORDER BY
Summe desc
All das alles unter der Annahme, dass versucht wird auf exakt einer Tabelle (Name: 'ranking', in den Beispielen oben als 'DT_1' bzw. 'DT_2' benannt) herumhühnernd Informationen zu gewinnen.
yo,
Allerdings spricht unseres Erachtens nichts gegen:
meines erachtens spricht dagegen, dass top, bzw. limit klauseln immer mit vorsicht zu genießen sind, da sie gleiche werte (in diesem fall die summen) auschließen und das zu ungewollten ergebnissen führt. immer sicherer ist der weg über unterabfragen, in der der gesuchte wert (maximum) ermittelt wird und dann mit der entsprechenden tabelle abgeglichen wird. dann treffen auch alle gesuchten datensätze und nicht nur der erste.
Ilja