2016-04-02 7 views
1

ich unten Abfrage bin mit:Wie nur den einen Mitarbeiternamen aus jeder Abteilung erhalten, wenn die maximale Gehalt von mehr als einem Mitarbeiter gleich ist

SELECT rownum, job_id, employee_id, first_name, last_name, phone_number, salary 
FROM employees OUTER 
WHERE salary = 
(
SELECT MAX(salary) 
FROM employees 
WHERE job_id = OUTER.job_id 
GROUP BY job_id 
) 
AND ROWNUM < 6; 

Und unten Ergebnis zu erzielen:

1 AD_PRES 100 Steven King 515.123.4567 24000 
2 AD_VP 101 Neena Kochhar 515.123.4568 17000 
3 AD_VP 102 Lex De Haan 515.123.4569 17000 
4 IT_PROG 103 Alexander Hunold 590.423.4567 9000 
5 FI_MGR 108 Nancy Greenberg 515.124.4569 12008 

table

Aber das Problem ist, ich möchte nur einen Namen für jede JOB_ID. Und das sollte durch alphabetische Präferenz in FIRST_NAME entschieden werden.

+0

Keine Bilder danke. Genau die richtige CREATE und Anweisungen INSERT und/oder ein sqlfiddle – Strawberry

Antwort

0

Eine Option wäre die Verwendung einer Unterabfrage, die job_id für den Vornamen enthält, den Sie beibehalten möchten. Ich habe Ihre ursprüngliche Abfrage in einen allgemeinen Tabellenausdruck verpackt, um sie lesbarer zu machen.

WITH t AS 
(
    SELECT rownum, job_id, employee_id, first_name, last_name, 
     phone_number, salary 
    FROM employees OUTER 
    WHERE salary = 
    (
     SELECT MAX(salary) 
     FROM employees 
     WHERE job_id = OUTER.job_id 
     GROUP BY job_id 
    ) 
    AND ROWNUM < 6; 
) 

SELECT t1.rownum, t1.job_id, t1.employee_id, t1.first_name, t1.last_name, 
    t1.phone_number, t1.salary 
FROM t t1 
INNER JOIN 
(
    SELECT job_id, MAX(first_name) AS max_name 
    FROM t 
    GROUP BY job_id 
) t2 
    ON t1.job_id = t2.job_id AND t1.first_name = t2.max_name 
0

Verwendung analytic functions:

select * from (
    SELECT job_id, employee_id, first_name, last_name, phone_number, salary, 
    RANK() over (
     job_id 
     order by 
      salary desc, 
      first_name, 
      employee_id -- adding employe_id breaks ties in the ordering 
     ) as rnk 
    FROM employees 
) where rnk = 1; 

Dies wird wahrscheinlich auch eine bessere Leistung als die subselect.

All dies wird ohne eine Datenbank zur Hand geschrieben, so dass es Tippfehler enthalten könnte

+0

immer diese Fehlermeldung: ORA-00923: FROM-Schlüsselwort nicht gefunden, wo erwartet 00923. 00000 - * Ursache "Schlüsselwort FROM nicht an erwarteter Stelle gefunden": * Aktion: Fehler bei Zeile: 3 Spalte: 9 –

+0

@chanchalpanda gab es ein ',' zwischen 'Gehalt' und 'RANK()' fehlt –

+0

ORA-00907: fehlende rechte Klammer 00907. 00000 - "fehlende rechte Klammer" * Ursache: * Aktion: Fehler bei Zeile: 4 Spalte: 9 –