*Markus: (SQL) Bei Mehrfacheinträgen den aktuellsten?

Guten Abend,

ich habe eine Tabelle "Pruefungen". Dabei haben verschiedene Schüler diverse Fächer belegt und eine Note erhalten. Bei manchen Schülern gibt es aber 2 Noten oder mehr pro Fach. Ich will aber nur die neueste Note in diesem Fach ausgeben lassen (Zeugnis). Wie kann ich das anstellen?

So sieht es jetzt aus:
SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen WHERE P_S_Kandidat = 111;

Die Ausgabe:
  AM   4   06.02.06
TDO 4 15.03.06
TDO 1 07.06.06
TDO 1 05.03.07

In diesem Fall will ich also den untersten Eintrag haben, weil dieser das aktuellste Datum hat. Wie bekomme ich eine Ausgabe, die mir

AM  4  06.02.06
TDO 1 05.03.07

ausgibt?
Die Datenbank ist übrigens eine Oracle.

Markus

  1. Sup!

    order by datum, und dann den ersten nehmen?

    Gruesse,

    Bio

    --
    Never give up, never surrender!!!
    1. yo,

      order by datum, und dann den ersten nehmen?

      Sortierungen mit ORDER BY und eventuelle Einschränken über LIMIT sind für solche Zwecke vollkommen ungeeignet.

      Ilja

  2. Hallo Markus,

    ich habe eine Tabelle "Pruefungen". Dabei haben verschiedene Schüler diverse Fächer belegt und eine Note erhalten. Bei manchen Schülern gibt es aber 2 Noten oder mehr pro Fach. Ich will aber nur die neueste Note in diesem Fach ausgeben lassen (Zeugnis). Wie kann ich das anstellen?

    Die Ausgabe:
      AM   4   06.02.06
    TDO 4 15.03.06
    TDO 1 07.06.06
    TDO 1 05.03.07

    diese Standardaufgabe kannst Du mit einer korrelierten Unterabfrage lösen,
    siehe z.B:

    https://forum.selfhtml.org/?t=165112&m=1076544, 2. Schritt oder
    dieses Archivposting.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      danke für den Tipp. Ich bekomme es aber heute wohl trotzdem nicht mehr ganz hin, da ich jetzt nur das aktuellste Datum pro Schüler bekomme:

      SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen
      WHERE P_S_Kandidat = 111 AND P_Datum =
      (SELECT MAX(P_datum) FROM pruefungen WHERE P_S_Kandidat = 111);

      Irgendwie weiß ich nicht so recht, wie ich die Abfrage umformulieren muss.

      Markus

      1. Hallo Markus,

        danke für den Tipp. Ich bekomme es aber heute wohl trotzdem nicht mehr ganz hin, da ich jetzt nur das aktuellste Datum pro Schüler bekomme:

        SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen
        WHERE P_S_Kandidat = 111 AND P_Datum =
        (SELECT MAX(P_datum) FROM pruefungen WHERE P_S_Kandidat = 111);

        Du hast das missverstanden. Nein, in die Unterabfrage wird _keine_ id eingebaut.
        Du benötigst die neueste Note
            je Schüler
            je Fach und

        Also

          
        SELECT                           -- Gib mir  
            p1.P_S_Kandidat,             -- den Schüler  
            p1.P_G_Fach,                 -- das Fach  
            p1.P_Note,                   -- die Note  
            p1.Datum                     -- und das Datum, an dem der Schüler die Note  
                                         -- in diesem Fach erzielt hat  
        FROM pruefungen p1               -- aus der Tabelle pruefungen, die in der  
                                         -- äußeren Abfrage über den Aliasnamen p1  
                                         -- angesprochen wird  
        WHERE p1.Datum = (               -- wobei das Datum der Prüfung in einem Fach  
            SELECT                       -- gleich dem  
                MAX(p2.Datum)            -- neuesten Prüfungsdatum  
            FROM  
                pruefungen p2            -- (aus der gleichen Tabelle, die wir zur  
                                         -- Unterscheidung über den Namen p2 ansprechen)  
            WHERE  
                p2.P_S_Kandidat = p1.P_S_Kandidat  -- pro Kandidat  
                AND p2.P_G_Fach = p1.P_G_Fach      -- und Fach ist  
            )  
        /* Hier kannst Du nun weiter einschränken */  
        WHERE p1.P_S_Kandidat = 111      -- nur die Noten des Schülers 111  
        
        

        Waren in den verlinkten Beispielen nur die neuesten Artikel je Autor bzw. der
        letzte Umsatzeintrag je Kunde interessant, so sind es bei Dir die neuesten
        Noten je Fach und Schüler.
        Daraus resultiert die UND-Verknüpfung im Subselect - wie ich es über dem
        SQL-Code bereits zusammengefaßt habe. Bei weiteren Klassifizierungen geht
        man analog vor.

        Wenn ich mal etwas Zeit finde, sollte ich das wirklich zu einem weiteren
        Datenbankartikel ausbauen. Danke für das Beispiel :-)

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          danke für deine ausführliche Antwort.
          Übrigens befindet sich dein Artikel über die JOINs auch in meinen Bookmarks. Er hat mir nämlich auch schon geholfen,

          Markus

        2. Hallo nochmal,

          auf einen kleinen Fehler bin ich draufgekommen, und zwar gehört anstatt des letzten WHERE ein AND. Dann funktioniert die Abfrage problemlos.

          Markus