2017-12-28 5 views
-7

Ich muss die Namen der Schüler anzeigen, die den Mindestdurchschnitt der Noten aus jedem Jahr haben. Die Tabellen Ich habe die folgende Struktur verwenden:Minimum Durchschnitt

students 
s_name | s_id | year 

grades 
s_id | grade 

Alles, was ich versucht habe, funktioniert nicht richtig.

SELECT s.s_name FROM students s JOIN grades g ON s.s_id=g.s_id 
GROUP BY s.s_name, s.year HAVING AVG(g.grade) = (SELECT MIN(AVG(g.grade)) FROM students s JOIN grades g ON s.s_id=g.s_id GROUP BY s.year) 
+0

und bitte Beispiel Eingangs- und Ausgangswerte liefern. – Pirate

+0

Was ist der Primärschlüssel und kann student_id nur für ein Jahr verfügbar sein? – BRjava

Antwort

1

Bitte versuchen Sie diese Abfrage:

CREATE TABLE #STUDENT 
    (
     S_NAME VARCHAR(2), 
     S_ID INT IDENTITY(1,1) PRIMARY KEY, 
     YEAR INT 
    ); 
    CREATE TABLE #GRADES 
    (
     S_ID INT IDENTITY(1,1) PRIMARY KEY, 
     GRADE DECIMAL(3,2) 
    ); 

    INSERT INTO #STUDENT VALUES('X1',2010); 
    INSERT INTO #STUDENT VALUES('X2',2010); 
    INSERT INTO #STUDENT VALUES('X3',2010); 
    INSERT INTO #STUDENT VALUES('X4',2010); 
    INSERT INTO #STUDENT VALUES('X5',2011); 
    INSERT INTO #STUDENT VALUES('X6',2011); 
    INSERT INTO #STUDENT VALUES('X7',2011); 
    INSERT INTO #STUDENT VALUES('X8',2012); 
    INSERT INTO #STUDENT VALUES('X8',2012); 
    INSERT INTO #STUDENT VALUES('X8',2012); 

    INSERT INTO #GRADES VALUES(6.5); 
    INSERT INTO #GRADES VALUES(6.9); 
    INSERT INTO #GRADES VALUES(7.3); 
    INSERT INTO #GRADES VALUES(6.0); 
    INSERT INTO #GRADES VALUES(7.9); 
    INSERT INTO #GRADES VALUES(8.1); 
    INSERT INTO #GRADES VALUES(6.6); 
    INSERT INTO #GRADES VALUES(7.2); 
    INSERT INTO #GRADES VALUES(7.6); 
    INSERT INTO #GRADES VALUES(8.2); 

    SELECT STUDENT_NAME, S_ID, YEAR, GRADE 
    FROM (
     SELECT 
      FIRST_VALUE(ST.S_NAME) OVER (PARTITION BY ST.YEAR ORDER BY GR.GRADE ASC) AS 'STUDENT_NAME', 
      ST.S_ID, ST.YEAR, GR.GRADE, 
      ROW_NUMBER() OVER (PARTITION BY ST.YEAR ORDER BY GR.GRADE ASC) AS 'RANK' 
     FROM #STUDENT ST 
     INNER JOIN #GRADES GR ON ST.S_ID = GR.S_ID 
    )A 
    WHERE A.RANK = 1 

    DROP TABLE #STUDENT 
    DROP TABLE #GRADES 

enter image description here