Select von 2 Maximumwerten

Tommy57

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem:

In einer Schulklasse werden die Schulnoten eines jeden Schülers gespeichert. Ich möchte nun eine Abfrage machen, die mir innerhalb einer Zeitspanne die LETZTE SCHLECHTESTE Schulnote alle Schüler raussucht. Jede Zeile entspricht einer Schulnote eines bestimmten Schülers an einem bestimmten Tag. Somit können an einem Tag auch mehrere Schulnoten für einen Schüler eingetragen sein.

Ich würde es wie folgt lösen:

Code:
SELECT
    x1.schueler_id,
    x1.maxdate,
    MAX(x2.note) as maxnote
FROM
    (SELECT
        schueler_id,
        MAX(datum) AS maxdatum
    FROM
        schulnoten
    WHERE
       datum BETWEEN (DATE ( '2011-11-01' ) - INTERVAL '2 weeks') AND '2011-11-01'
    GROUP BY
        schueler_id) x1
INNER JOIN
    schulnoten x2
ON
    x1.schueler_id = x2.schueler_id
AND
    x1.maxdate = x2.datum
GROUP BY
    x1.schueler_id,
    x1.maxdate

Kann ich dieses Statement nun irgendwie umformulieren, dass ich das selbe Ergebnis auch OHNE join bekomme? Das Statement wird noch sehr groß, da mehrere Zeiträume miteinander verrechnet werden müssen. Das würde der Übersichtlichkeit helfen und vllt sogar der Performance.

Ich nutze Postgres.

Gruß, Tommy
 
Ich werde gerade nicht so schlau, was du möchtest. Du willst von jeden Schüler die schlechteste Note in einem bestimmten Zeitraum haben oder? Dabei kann diese ja auch mehrmals auftauchen.

Naja, mit dem Join machst du eine Referenz auf die selbe Tabelle. Du vergleichst sie mit sich selber, was ab und zu Vorteile bringt, welchen ich aber hier nicht sehe.

Gruß
 
Hallo,

ich suche die LETZE Note in einem bestimmten Zeitraum, und wenn an dem Tag mehrere Noten vorliegen, die SCHLECHTESTE von denen.

Gruß
 
Mit bissel testen müsste es so klappen :)

Code:
SELECT
    schueler_id, MAX(datum) AS Datum, MAX(schulnote) AS Note
FROM
    schulnoten
Where
    Datum BETWEEN SUBDATE('2011-11-01',INTERVAL 14 DAY) AND '2011-11-01'

GROUP BY schueler_id

Hatte mir eine Testtabelle gemacht. Kann also sein, das du die Bezeichnungen anpassen musst
 
Hi Kalito,

dein Statement gibt mir das letzte Datum und die schlechteste Schulnote. Unter Umständen kriege ich ne zusammengewürfelte Zeile. Ich brauche aber die Schulnote am letzten Schultag und für den Fall, dass am letzten Schultag mehrere Schulnoten vorliegen, die schlechteste von denen.

Beispiel

1; 2011-10-21; 1
1; 2011-10-22; 3
1; 2011-10-22; 5
1; 2011-10-24; 4
1; 2011-10-25; 6
1; 2011-10-28; 2
1; 2011-10-28; 4

So wäre das gesuchte Ergebnis die letzte Zeile. Dein Statement würde mir die vorvorletzte Zeile und die letzte Zeile zusammenschmeißen.

Gruß
 
Der JOIN den du bereits hast ist mMn die beste Lösung.

ggf. Kann man das mit dem 'da mehrere Zeiträume miteinander verrechnet werden müssen' noch etwas verbessern wenn ich da mehr drüber wüsste wie das gemeint ist.
 
Hi Yaslaw,

ich habe mich für folgende Variante entschieden:
SQL:
... x1
INNER JOIN
    (SELECT
        schueler_id,
        note,
        MAX(datum) AS maxdatum
    FROM
        schulnoten
    WHERE
       datum BETWEEN (DATE ( '2011-11-01' ) - INTERVAL '2 weeks') AND '2011-11-01'
    GROUP BY
        schueler_id,
        note
    ORDER BY
        note DESC
    LIMIT 1) x2
ON
    x1.schueler_id = x2.schueler_id
...

Es werden halt mehrere Intervalle verrechnet und das wird n Monster Statement, wo man später einfach jede Übersicht verlieren wird.

Danke euch beiden!

Gruß
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück