SQL Oracle SQL Max wert vom counter ausgeben

Saltybites

Cadet 4th Year
Registriert
Nov. 2017
Beiträge
65
Hallo ich soll in Oracle SQL eine tabelle ausgeben wo nur der Fluss der durch die meisten Länder fließt ausgegeben wird.
Das ergebnis soll so aussehen:Hier

Doch mein ergebnis zeigt entweder nur den counter oder die gesammte liste und nicht nur den max wert.
Code:
select max(Counter) as MaxCounter
from (select river, count(distinct(country)) as Counter
from geo_river
group by river);
Codeausgabe:Hier

Code:
SELECT tmpTable.river, MAX(tmpTable.Counter) as MaxCounter FROM (
    SELECT gr.river, COUNT( DISTINCT(gr.country)) as Counter
    FROM geo_river gr
    GROUP BY gr.river
    )  tmpTable
    group by tmpTable.river
    order by MaxCounter desc;

Codeausgabe : Hier

Wenn ich es so versuche:
Code:
SELECT tmpTable.river, MAX(tmpTable.Counter) as MaxCounter FROM (
    SELECT gr.river, COUNT( DISTINCT(gr.country)) as Counter
    FROM geo_river gr
    GROUP BY gr.river
    )  tmpTable;

bekomme ich einen syntax fehler:
ORA-00937: keine Gruppenfunktion für Einzelgruppe
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
Fehler in Zeile: 131 Spalte: 8

Hat da wer ne idee wie ich es lösen kann?
rownum um nur die erste zeile auszugeben ist nicht erlaubt

Danke im vorraus
Gruß Saltybites
 
nvm... xD
 
Zuletzt bearbeitet:
Mahlzeit amokkx, hier ein Beispiel.

Code:
SELECT o.Name, f.Name
FROM Ort o, StadtFluss sf1, Fluss f
WHERE o.ONR = sf1.ONR
AND f.FNR = sf1.FNR
AND EXISTS (SELECT NULL FROM StadtFluss sf2
WHERE sf1.FNR<>sf2.FNR AND sf2.ONR=o.ONR)
ORDER BY o.Name
 
Hexxxer76 schrieb:
Mahlzeit amokkx, hier ein Beispiel.

Code:
SELECT o.Name, f.Name
FROM Ort o, StadtFluss sf1, Fluss f
WHERE o.ONR = sf1.ONR
AND f.FNR = sf1.FNR
AND EXISTS (SELECT NULL FROM StadtFluss sf2
WHERE sf1.FNR<>sf2.FNR AND sf2.ONR=o.ONR)
ORDER BY o.Name

Bezieht sich das jetzt auf meine Frage oder auf den bearbeiteten post von amokkx?
Falls es sich auf meine frage bezieht frage ich mich gerade wieso du 3 tabellen (Ort, StadtFLuss, Fluss) hast und wo wird da genau gezählt und der Max wert ausgegeben?
 
Dies ist ein "Beispiel" aus meinem Daten !
Ergänzung ()

Edit: Man sollte schon selber versuchen ! Wenn man es "fertig" hingesetzt bekommt lernt man nicht wirklich was dabei ! Grüße
 
Ich hab es ja versucht bin aber erfolglos gewesen xD
Sitze bereits ne weile dran komme aber entweder auf die liste mit vielen einträgen oder mir wird nur der counter ausgegeben.
Ich komme wohl zum ergebnis wenn ich rownum nutze aber das ist ja nicht erlaubt.
 
Nvm :P
 
rownum=1 ist etwas unschön.
Ergänzung ()

Anstatt rownum=1:
... WHERE COUNT(country)=SELECT MAX(Counter) FROM ... GROUP BY ...

oder HAVING Counter=MAX(Counter) unten dran.
 
Zuletzt bearbeitet:
Oracle hat da noch andere Möglichkeiten. Für derartige Probleme bietet sich FIRST_VALUE in Verbindung mit OVER förmlich an ...
 
Naja hab jetzt ne Lösung:
Code:
select river, count(distinct(country)) as Counter
from geo_river
group by river
having count(distinct(country))=(select max(Counter) as MaxCounter
from (select river, count(distinct(country)) as Counter
from geo_river
group by river));

Danke für eure Vorschläge
Gruß Saltybites
 
Kann dasselbe Land wirklich mehrmals bei einem Fluss vorkommen? Wenn nicht, dann wäre das DISTINCT überflüssig. Ansonsten kannst Du mit einem SELECT weniger auskommen:
Code:
SELECT river, COUNT(DISTINCT country) AS Counter
FROM geo_river
GROUP BY river
HAVING COUNT(DISTINCT country)=(SELECT MAX(COUNT(DISTINCT country))
                                FROM geo_river
                                GROUP BY river);
Ich würde bei DISTINCT auf die Klammern verzichten, DISTINCT ist keine Funktion und die Schreibweise kann zu Denkfehlern führen.
 
Zuletzt bearbeitet:
Ja wenn ich das distinct weg lasse zeigt der mir öfters das selbe land an. Z.B. fließt es 12 mal durch romänien da er diese dann nochmal auf jede einzelne provinz aufteilt.
Aber wieso kann man denn nicht die MAX(COUNT()) funktion in der ersten select anweisung nutzen? Das versteh ich nicht x)

Und wieso kann man den
Code:
COUNT(DISTINCT country) AS Counter
nicht im Max verwenden also
Code:
MAX(Counter)
Und danke für die verkürzung die funktioniert :)
 
Zuletzt bearbeitet:
Das sind sogenannte nested aggregate functions.
Die Abfrage
Code:
SELECT river, COUNT(DISTINCT(country)) AS Counter
FROM geo_river
GROUP BY river;
Ist bereits nach "river" gruppiert. Du hast also pro river bereits einen einzigen aggregierten Wert. Das Maximum von einem einzelnen Wert ist immer der Wert selber. Maximum wäre also an der Stelle zum einen sinnlos, darüber hinaus lässt Oracle diese "doppelte" Gruppierung nicht zu.
 
Zurück
Oben