2017-01-26 2 views
-1

Ich muss alle Schüler mit ihrer DESC auflisten.Wie bekomme ich Max Datum von diesen SQL-Tabellen

Schritte des Algorithmus:

  1. In Tabelle STUDENT_TYPE, für jeden Schüler, erhalten die TYPE_ID für den Datensatz mit maximal DT_OF_WORK Datum.

  2. Mit dem TYPE_ID gefunden, die DESC aus Tabelle STUDENT_DESC

  3. Liste aller Studenten STUDENT mit ihrem DESC bekommen.

Hier sind die drei SQL-Tabellen.

Tabelle STUDENT_TYPE

Primärschlüssel ist: (Student_ID, DT_OF_WORK)

|Student_ID | TYPE_ID | DT_OF_WORK | CATEGORY| 
|   1 |  1 | 01-JAN-2017 |   B| 
|   1 |  2 | 11-JAN-2017 |   A| 
|   1 |  1 | 02-JAN-2017 |   A| 
|   1 |  1 | 03-JAN-2017 |   A| 
|   3 |  2 | 16-JAN-2017 |   A| 
|   3 |  1 | 03-JAN-2014 |   A| 
|   3 |  1 | 23-JAN-2012 |   A| 
|   4 |  2 | 02-JAN-2013 |   A| 

Tabelle STUDENT_DESC

|TYPE_ID|DESC | 
|  1|LEAD | 
|  2|TOPPER| 

Tabelle STUDENT:

|STUDENT_ID|NAME | 
|   1|JACK | 
|   2|RAVI | 
|   3|SEENU | 
|   4|RAM | 
  • STUDENT_ID (STUDENT_TYPE) = STUDENT_ID (Student)
  • TYPE_ID (STUDENT_TYPE) = TYPE_ID (STUDENT_DESC)

gewünschte Ausgabe:

|STUDENT_ID|NAME |DESC | 
|   1|JACK |LEAD | 
|   2|RAVI |null | 
|   3|SEENU |TOPPER| 
|   4|RAM |TOPPER| 

Vielen Dank für Ihre Zeit.

+2

Welche RDBMS verwenden Sie? MySQL? PostgreSQL? SQL Server? – Cameron

Antwort

1

Es gibt mehrere verschiedene Möglichkeiten, die Sie erreichen können. Und da Sie nicht angegeben haben, welche Datenbank-Engine ich annahm, nahm ich SQL Server an.

Bedenkt man, wie groß Ihre Tabellen sind dies nicht die performant sein kann, aber dies den Trick tun sollten:

WITH Rankings 
      AS (SELECT * 
       FROM  (SELECT st.Student_ID 
            , st.Type_Id 
            , ROW_NUMBER() OVER (PARTITION BY st.Student_ID ORDER BY st.DT_Of_Work DESC) AS RowNumber 
          FROM  Student_Type AS st) q 
       WHERE q.RowNumber = 1) 
    SELECT s.Student_Id 
      , s.Name 
      , d.[Desc] 
    FROM Student s 
    LEFT OUTER JOIN Rankings c 
    ON  s.Student_Id = c.Student_Id 
    LEFT OUTER JOIN Student_Desc d 
    ON  d.Type_ID = c.Type_ID; 

Dies funktioniert effektiv durch die Zeilen aufgeteilt und ihnen eine Reihe basierend auf der Partition zu geben und die Bestellung von in der ROW_NUMBER() Funktion. Wir wählen dann die niedrigste (mit dem Wert 1) und verwenden es, um die aktuellste Type_Id zu bestimmen. Mit Hilfe von ein paar outer joins können wir alle Daten bekommen.

Seitennotiz: Ihre erwartete Ausgabe ist falsch. Jack's DESC sollte TOPPER sein.

Verwandte Themen