Ich versuche, das zweithöchste Gehalt in jeder Abteilung zu finden.Zweithöchstes Gehalt in jeder Abteilung
Schema:
CREATE TABLE employees
(
ID int NOT NULL,
NAME char(50) NOT NULL,
departmentid int,
salary int
);
Beispielsätze:
/*departmentid =1 */
INSERT INTO employees VALUES (1, 'Max', 1, 90000);
INSERT INTO employees VALUES (2, 'Joe', 1, 70000);
INSERT INTO employees VALUES (3, 'Randy', 1, 70000);
/*departmentid =2 */
INSERT INTO employees VALUES (4, 'Henry', 2, 80000);
INSERT INTO employees VALUES (5, 'SAM', 2, 60000);
/*departmentid =3 */
INSERT INTO employees VALUES (6, 'Janet', 3, 69000);
Meine Frage:
SELECT departmentid,
NAME,
salary
FROM
(
SELECT
departmentid,
NAME,
salary,
Dense_rank()OVER (partition BY departmentid
ORDER BY salary DESC) AS Rank,
Count(1)OVER(partition BY departmentid) AS cnt
FROM
employees
)t
WHERE
t.rank = 2
OR (t.rank = 1
AND cnt = 1)
Der Ausgang ich bekommen habe ist, wie unten;
departmentid NAME salary
1 Joe 70000
1 Randy 70000
2 SAM 60000
3 Janet 69000
Meine erwartete Ausgabe
departmentid NAME salary
1 Joe 70000
1 Randy 70000
2 SAM 60000
3 NULL NULL
ist Da es nur einen Datensatz für DepartmentID ist = 3, sollte es null zurück.
Was ist falsch an dieser Abfrage? Gibt es andere Möglichkeiten, dieses Ergebnis zu erzielen?
Ich habe auch eine SQL fiddle enthalten.
Bitte lesen Sie [Warum sollte ich einen MCVE für das, was mir scheint eine sehr einfache SQL-Abfrage zu sein?] (Https://meta.stackoverflow.com/questions/ 333952/why-soll-ich-biete-eine-mcve-für-was-scheint-zu-mir-sein-eine-sehr-einfache-sql-Abfrage). Ihre Frage sollte * Ihre Frage enthalten *, kein Link zu einem anderen Ort, an dem Ihre eigentliche Frage zu finden ist. – AakashM