Hilfe bei einer Abfrage

Moin Ich bin es mal wieder liebes Forum ich habe eine Frage zu einer Abfrage die Ich schreiben möchte und ich komme nicht weiter bisher sieht meine Abfrage so aus

Select DISTINCT(fk_t_spiel_spiel_id,fk_t_haelfte_art,fk_t_runde_rundennr),fk_t_spieler_kennung
from t_durchgang
group by (fk_t_spiel_spiel_id,fk_t_haelfte_art,fk_t_runde_rundennr),fk_t_spieler_kennung,zaehler
Having fk_t_spieler_kennung=‘opa’

Ich habe mal die Relation als Anhang dazu gestellt

Ich möchte mit der Abfrage von einem Spieler die Wüuefel1 ,Wuerfel2 ,Wuerfel3 aus der Datenbank hohlen Bedingung für das Ergebnis ist das es die Würfel sind wo der Zaehler am höchsten steht in der jeweiligen Runde.

zum Beispiel möchte Ich vom Spieler Opa alle Würfe haben die zu einem Spiel zu einer Hälfte und zu einer Runde gehören der Zähler gibt hier das ausschlaggebende Kriterium an da immer nur der Wurf zählt welcher der letzte war. Deshalb dachte Ich ich hohle mir erstmal ale Würfe vom Spieler die er jemals in die DB geschrieben hat dann versuche ich nur den Wurf zu bekommen wo der Zählerin der Runde am höchsten ist

Leider komme Ich nicht weiter mein Derzeitiges Ergebnis sieht so aus das es mir zwar alle von einem Spieler angibt reduziert auf die einzelnen Runden die der Spieler jemals gespielt hat.

Sobald ich versuche die Würfel mit zu selektieren spukt mir das Ergebnis wieder alle Würfe aus
durchgang.GIF

kannst Du das mal verständlicher erklären? Klingt so, als möchtest Du innerhalb einer Gruppe den höchsten Wert einer Zähler-Spalte. Das wäre dann ein Fall für row_number() over (…) oder rank() over (…) und dann davon dann nur die Zeilen nehmen, wo dort dann 1 ist.

test=*# select *, row_number() over (partition by spieler order by zaehler desc) from mero ;
 spieler | zaehler | row_number 
---------+---------+------------
 bar     |      20 |          1
 bar     |      12 |          2
 bar     |      12 |          3
 bar     |       8 |          4
 bla     |      15 |          1
 bla     |      10 |          2
 foo     |      34 |          1
 foo     |       7 |          2
 foo     |       2 |          3
(9 Zeilen)

test=*# select * from (select *, row_number() over (partition by spieler order by zaehler desc) from mero) blubb where row_number = 1 ;
 spieler | zaehler | row_number 
---------+---------+------------
 bar     |      20 |          1
 bla     |      15 |          1
 foo     |      34 |          1
(3 Zeilen)

Ich möchte mir zum Beispiel vom Spieler Opa nur die Wuerfel 1 bis drei anzeigen lassen die in einer Runde beim Höchsten Zahler stehen
Es handelt sich bei der Tabelle um eine Tabelle bei einem Würfelspiel wo jeder Spieler maximal 3 Versuche hat um ein Würfelbild zu erzielen. Der Spieler kann aber vorher schon sagen das er genug gewürfelt hat und dann diese Würfelbild spielt

Also brauche ich immer die Zeile der Runden wo der Zähler am höchsten ist

dann sortierst du intern anders. Oder was genau willst Du?

Ich habe hier in der Tabelle mal alle Daten vom Spieler Opa ausgeben lassen. Mich interessiert hier aber nur die Zeilen 3,6,7,10,13,16,17

Diese Zeilen müsste Ich meines Erachtens irgendwie mit einer Group by raus bekommen. Die Gruppen wären dann immer aus Spalte 1, 2,3 und 4. Und von diesen Gruppen nur die Einträge wo der Zähler für diese Gruppe am Höchsten ist.

Das heißt in meiner Tabelle das der Spieler opa 7 Runden gespielt hat, zu erkennen ander letzten Zeile fk_t_runde_rundennr =7

In allen Runden die dieser Spieler gespielt hat, hat er 3 mal gewürfelt bis auf die Runde 3 und Runde 1 zu erkennen am zaehler

Ich bin mir nicht sicher ob man das mit einer einzigen Abfrage bekommt
opa.GIF

Ja, und was hindert Dich? Ich nannte doch die Lösung schon längst…

test=# select * from mero ;
 id | runde | zaehler 
----+-------+---------
  1 |     1 |       1
  2 |     1 |       2
  3 |     1 |       3
  4 |     2 |       1
  5 |     2 |       2
  6 |     2 |       3
  7 |     3 |       1
  8 |     4 |       1
  9 |     4 |       1
 10 |     4 |       3
 11 |     5 |       1
 12 |     5 |       2
 13 |     5 |       3
 14 |     6 |       1
 15 |     6 |       2
 16 |     6 |       3
 17 |     7 |       1
(17 Zeilen)

test=*# select *, row_number() over (partition by runde order by zaehler desc) from mero ;
 id | runde | zaehler | row_number 
----+-------+---------+------------
  3 |     1 |       3 |          1
  2 |     1 |       2 |          2
  1 |     1 |       1 |          3
  6 |     2 |       3 |          1
  5 |     2 |       2 |          2
  4 |     2 |       1 |          3
  7 |     3 |       1 |          1
 10 |     4 |       3 |          1
  9 |     4 |       1 |          2
  8 |     4 |       1 |          3
 13 |     5 |       3 |          1
 12 |     5 |       2 |          2
 11 |     5 |       1 |          3
 16 |     6 |       3 |          1
 15 |     6 |       2 |          2
 14 |     6 |       1 |          3
 17 |     7 |       1 |          1
(17 Zeilen)

test=*# select id from (select *, row_number() over (partition by runde order by zaehler desc) from mero ) foo where row_number = 1;
 id 
----
  3
  6
  7
 10
 13
 16
 17
(7 Zeilen)

Danke es funktioniert jetzt