Bestes Ergebnis aus einer Tabelle Filtern?

Huhu,

gehoere zu den Postgre Neueinsteigern. Sitze hier gerade bei der Arbeit und soll ein mehr oder minder großes Projekt nach CSharp/ASP.Net portieren.

Im Folgendenden erklaere ich die Situation.

Das Ganze ist ein Mathe-Lern-Programm fuer Grundschulen, es werden 30 Fragen gestellt, [(Ausgewertet) …] und werden dann am Ende in einer High-Score Liste eingetragen.

Die Tabelle, “sessions” sieht bei mir momentan so aus:



session_id   answered_right   answered_wrong   start_time   end_time user_id
155          30               0                11:36:40     11:37:10 3
156          30               0                12:22:00     12:23:00 3       
157          29               1                12:54:12     12:57:14 6

Mein Query fuer die Highscoreliste sieht folgendermaßen aus:

cmd.CommandText = "SELECT answered_right, answered_wrong, start_time, end_time, users.login_name AS login_name FROM sessions INNER JOIN users ON users.user_id=sessions.user_id WHERE 1=1 ORDER BY answered_right DESC, (end_time - start_time) ASC";

Funktioniert, wunderbar sogar! Allerdings Moechte ich nur das beste Ergebnis outputten (Abhaengig von Zeit / Anzahl Fehlern) - gibt es eine Moeglichkeit dies mittels Postgre zu tun, oder muesste ich dafuer einen Algorithmus schreiben?


Thanks in Advance,


Der Postgreneuling :wink:

Ja, ja.

Dich interessiert ja nur nur die User-Id und die Platzierung, oder? Also in etwa sowas, ausgehend von Deinem Bleistift:

test=*# select * from foo;
 id  | a_right | a_wrong |  s_time  |  e_time  | uid
-----+---------+---------+----------+----------+-----
 155 |      30 |       0 | 11:36:40 | 11:37:10 |   3
 156 |      30 |       0 | 12:22:00 | 12:23:00 |   3
 157 |      29 |       1 | 12:54:12 | 12:57:14 |   6
(3 rows)

Time: 1.653 ms
test=*# select uid, max(a_right),  min(e_time-s_time) from foo group by uid order by 1;
 uid | max |   min
-----+-----+----------
   3 |  30 | 00:00:30
   6 |  29 | 00:03:02
(2 rows)

In kurz: Aggregatfunktionen wie max() und min() sowie GROUP BY sind Deine Freunde.
In lang: Doku lesen :wink:

Andreas