Begrenzte Listendarstellung

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:

Ich wollte es nur erwähnen, weil ich immer wieder Leute treffe, die denken das der JOIN Operator was “ganz neues” wäre.
Einige verbreitete Datenbanksysteme haben das auch sehr lange nicht unterstützt (Oracle, SQL Server). Und in der Oracle Community gibt es noch einige Benutzer die sich immer noch weigern das zu verwenden weil es ganz am Anfang als Oracle das vor rund 15 Jahren eingeführt hat ein paar Bugs mit der Syntax gab.

Leider muss ich auch Postgres einen kleinen Vorwurf machen, weil in der Dokumentation praktisch alle Beispiele implizite joins verwenden und nicht den expliziten JOIN Operator.

Die impliziten joins haben das Problem, dass sie leicht in einem ungewollten cross join resultieren weil es kein Syntaxfehler ist die join Bedingung zu vergessen. Deswegen empfehle ich immer wo es nur geht, den “modernen” JOIN Operator zu verwenden.

FULL ack! (letzter Absatz)

Fri Oct 05 2018 19:52:14 GMT+0200 (CEST) <<< ist das Format von date_time in meiner Tabelle
Frage: ist es möglich dieses Format zu wandeln damit ich mit TT.MM.JJJJ alles vom 05.10.2018 auslesen kann, oder geht das nur mit der between … and Bedingung

vermutlich hast da also ein timestamptz drin stehen, select spalte::date liefert dir das reine Datum, where spalte::date=‘2018-10-05’ könntest Du es prüfen, oder via to_char(spalte, ‘tt.mm.yyyy’) auf Dein Format bringen.

Bitte schaue Dir die passenden Funktionen an:

https://www.postgresql.org/docs/10/static/functions-formatting.html
https://www.postgresql.org/docs/10/static/functions-datetime.html