Begrenzte Listendarstellung

Hallo zusammen,

ich bin neu hier im Forum

Meine Frage:
Ich habe eine Tabelle mit Sportergebnissen
Name; Verein; Ergebnis; Disziplin.

Angenommen 100 Namen; 20 Vereine; 400 Ergebnisse; 10 Disziplinen
Ich bräuchte nun eine Liste in der nur die besten fünf Namen pro Verein absteigend nach Einzel- und Vereinsergebnis gelistet werden.

Ich kann leider nur “alle” Namen nach meinen Vorstellungen selectieren, möchte aber wie geschrieben nur die besten fünf pro Verein haben.

vielleicht kann mir hier jemand helfen
vorab besten Dank

Du kannst erst einmal mit rank() over (partition by verein order by ergebnis desc) eine zusätzliche Spalte im Result erzeugen, und das in einem Subselect verwenden, wo du dann mittels WHERE rank <= 5 die Top 5 je Verein ausfilterst.

Schaffst Du jetzt, oder?

Sowas denke ich:

select name, verein, ergebnis, disziplin
from (
  select name, verein, ergebnis, disziplin, row_number() over (partition by verein order by ergebnis desc) as rn
  from sportergebnisse
) t
where rn <= 5
order by verein, ergebnis desc;

Die Abfrage geht davon aus, dass ein höheres Ergebnis ein besseres ist.

Wenn Du bei den “die 5 Besten” auch welche mit der gleichen Wertung drin haben willst (es dann aber mehr als 5 werden können), nimm dense_rank() anstatt row_number()

ich schenke Dir ein ‘r’ für das “ORDER” im over-Teil :wink:

Danke, eingepackt :wink:

Danke für die schnelle Hilfe, aber leider bringe ich den Subselect nicht in die richtige Reihe (fehlender Eintrag in FROM-Klausel für Tabelle Name)

was genau hast denn versucht?

hatte die Musterbezeichnungen so gewählt dass ich die Orginal Bezeichnungen nur rein kopieren mußte aber irgend wie klappt das nicht.
hab die Abfrage danach so vereinfacht dass ich nur noch Daten aus zwei Tabellen benötigte aber das hat auch nicht funktioniert.

die blose Abfrage und Sortiering Funktioniert korrekt, auch die row_ number Spalte wird korrekt gebildet.
Nnur sie Selectierung nach der rn bringe ich nicht auf die Reihe

Du hast also jetzt eine funktionierende Abfrage mit row_number(), ja?


select * from ( hier die funktionierende Abfrage ) ALIAS where row_number <= 5

Ich vermute mal, Du hast den Alias vergessen. In der Demo von @castorp ist das schlicht das t nach der schließenden Klammer.

select shooters.surname as Name,
shooters.forename as Vorname,
shooters.club as Verein,
journal.results as Ergebnis,
ROW_NUMBER() OVER (partition by shooters.club ORDER BY journal.results desc) as Platz
from home.journal,
home.shooters
where journal.shooters_id = shooters.shooters_id
and journal.event_status = ‘finished’
and journal.shooters_id >0
group by name,verein,vorname
order by Verein, Ergebnis desc

das funktioniert jetzt, oder?

Falls ja: in Klammern setzen, ein select * (oder die Spalten, die Du haben willst) davor und ein ALIAS where platz <= 5 dahinter.

Danke, Danke, Danke, es funktioniert wie gewünscht ,

EDV weckt Begehrlichkeiten
Ist es möglich diese 5 Einzelergebnisse zu einem Manschaftsergebnis zu summieren und sortieren

Es fehlt formal ein Group by “results”, geht vermutlich trotzdem nur, weil postgres schlau ist.
Das Group By … selbst ist insgesamt eigentlich auch überflüssig.

@ pogomips, hast recht results war hier nur Ersatz für sum() funktion

Das GROUP BY ist falsch und wird einen Fehler liefern - ist aber auch unnötig mit einer Window Funktion.

Du musst nur die aktuelle Abfrage in eine Sub-Query packen, dann klappt das:

select name, vorname, verein, ergebnis, platz
from (
  select shooters.surname as Name,
         shooters.forename as Vorname,
         shooters.club as Verein,
         journal.results as Ergebnis,
         ROW_NUMBER() OVER (partition by shooters.club ORDER BY journal.results desc) as Platz
  from home.journal
    join home.shooters ON journal.shooters_id = shooters.shooters_id
  where journal.event_status = 'finished'
    and journal.shooters_id > 0
) t
where platz <= 5
order by Verein, Ergebnis desc;

Ich habe Deine veralteten impliziten Joins gleich durch einen modernen expliziten JOIN Operator ersetzt.

Die Bedingung “and journal.shooters_id > 0” sieht etwas merkwürdig aus. Gibt es denn überhaupt Shooter mit der ID=0? Wenn, nicht, dass ist das überflüssig da der JOIN solche Datensätze ja eliminieren würde. Sieht schwer danach aus, als würde da ein Foreign key fehlen.

@castorp, das mit dem “veraltet” kommt auf den Punkt, ich hab seit 25 Jahren nichts mehr mit SQL zu tun und das Veraltete war mir eben noch etwas in Erinnerung. Versuche nun da Bedarf entstanden ist mich wieder etwas einzulesen und hoffe dass ich mich vertrauensvoll an euch wenden darf.

Deshalb mal Danke für eure schnelle Hilfe

Gruß Simar

Der explizite JOIN Operator wurde vor 29 Jahren im SQL Standard (“SQL:89”) eingeführt :wink:

ROFL :wink:

Weiß ich wohl, aber ich war und bin kein Entwickler sondern nur ein ahnungsloser Nutzer der damals und heute wieder, Auswertungen braucht. So gings für mich eben einfacher. Ich wußte damals nicht mal wie man UNIX SQL schreibt, aber meine Kalkulationen haben auf den, Pfennig damals, gestimmt. :sunglasses: