2016-09-30 2 views
-3

ich die Arbeit mit zwei TabellenNeed to top 3 Mitarbeiter

Mitarbeiter (empid integer, MGRID integer, deptid integer, Gehalt integer) Dept (deptid integer, deptname Text)

Ich finde Sie müssen in jeder Abteilung die besten 3 Angestellten (Gehaltsgrundlage) finden. Das Ergebnis sollte nach dem Namen "deptname", "empid" und "salary" nach "abtname" und dann nach "employee" mit einem hohen oder niedrigen Gehalt lauten.

Ich schätze all Ihre Hilfe !!

+1

was haben Sie versucht – Teja

+0

Ich entfernte die inkompatiblen Datenbank-Tags. Ein korrektes Datenbank-Tag, zusammen mit Beispieldaten und gewünschten Ergebnissen, kommen einer Frage zugute. –

Antwort

0

Diese Abfrage enthält zwei Teile. Die innere und äußere Abfrage.

Erster Teil, Partitionierung auf Depid-Ebene und Zuordnung des Rangs zu den Gehältern in absteigender Reihenfolge, die Ihr Problem löst. Der zweite Teil ist nur eine Auswahl in allen Ausgabefeldern, indem nur die obersten drei Mitarbeiter in jeder Abteilung herausgefiltert werden.

Schlüsselpunkt: - Zuweisen von Rang zu den Gehältern für jede Abteilung mit ROW_NUMBER Fensterfunktion in der inneren Abfrage löst das gesamte Problem.

SELECT deptname,empid,salary 
    FROM 
    (
     SELECT d.deptname, 
       e.empid, 
       e.salary, 
       ROW_NUMBER() OVER (PARTITION BY e.deptid ORDER BY 
       e.salary DESC) AS rank_salary_by_dept 
      FROM dept d, employee e 
     WHERE d.deptid = e.deptid 
    ) 
WHERE rank_salary_by_dept <= 3 
ORDER BY deptname,rank_salary_by_dept; 
+0

Danke SOaddict. Ist es möglich, dass Sie erklären, was das Skript in Anführungszeichen tut? OVER (PARTITION VON e.eptid ORDER BY e.salary DESC). Ich bekomme die ORDER BY, aber unter Bezugnahme auf "OVER: and" PARTITION BY " – IvanA930

+0

Ich beantwortete Ihre Frage mit mehr Details. – Teja

+0

Lassen Sie mich wissen, wenn Sie noch Fragen haben. – Teja