Dwóch najlepiej zarabiających pracowników w danym dziale

0

Witam,
Mam problem ze znalezieniem odpowiedniego zapytania, które wyświetli mi dwóch najlepiej zarabiających pracowników w dziale.
Napisałam zapytanie, które pozwala na znalezienie najlepiej zarabiającego pracownika w danym dziale (jego imienia, nazwiska oraz pensję):
SELECT t1.last_name, t1.first_name, t1.salary
FROM employeeS AS t1 LEFT JOIN
(SELECT t.department_id AS Dzial, MAX(t.salary) AS MaxWynagrodzenie
FROM employees AS t
GROUP BY t.department_id
) AS t2 ON t1.DEPARTMENT_ID = t2.Dzial
WHERE t1.department_id = t2.Dzial AND t1.salary = t2.MaxWynagrodzenie;
Mam jednak problem z napisaniem zapytania o dwóch najlepiej zarabiających pracowników w dziale. Niby zadanie wydaje się dość podobne, a jednak szukam i szukam rowiązania i nie udało mi się do tej pory stworzyć poprawnego zapytania. Bardzo proszę o pomoc, jeśli ktoś ma pomysł :)

0

Jaki DBMS?

1

tsql

DECLARE @employees TABLE
    (
        FirstName VARCHAR(255) ,
        LastName VARCHAR(255) ,
        Salary MONEY ,
        DepartmentId INT
    );

INSERT INTO @employees
VALUES ( 'a', 'a', 2000, 1 ) ,
       ( 'b', 'b', 3000, 1 ) ,
       ( 'c', 'c', 4000, 1 ) ,
       ( 'd', 'd', 3000, 1 ) ,
       ( 'e', 'e', 2000, 2 ) ,
       ( 'f', 'f', 3000, 3 ) ,
       ( 'g', 'g', 2000, 3 ) ,
       ( 'h', 'h', 1000, 3 );


SELECT *
FROM   (   SELECT * ,
                  RANK() OVER ( PARTITION BY DepartmentId
                                ORDER BY Salary DESC ) AS [Pos]
           FROM   @employees ) AS tmp
WHERE  tmp.Pos <= 2;

screenshot-20190613161215.png

0
Marcin.Miga napisał(a):

Jaki DBMS?

MySQL

0
Marcin.Miga napisał(a):

http://sqlfiddle.com/#!9/6e9fd1/3

Wielkie dzięki, spędzało mi to sen z powiek ;) Działa i już rozumiem swój błąd.
Pozdrawiam :)

0
ipsd napisał(a):

tsql

DECLARE @employees TABLE
    (
        FirstName VARCHAR(255) ,
        LastName VARCHAR(255) ,
        Salary MONEY ,
        DepartmentId INT
    );

INSERT INTO @employees
VALUES ( 'a', 'a', 2000, 1 ) ,
       ( 'b', 'b', 3000, 1 ) ,
       ( 'c', 'c', 4000, 1 ) ,
       ( 'd', 'd', 3000, 1 ) ,
       ( 'e', 'e', 2000, 2 ) ,
       ( 'f', 'f', 3000, 3 ) ,
       ( 'g', 'g', 2000, 3 ) ,
       ( 'h', 'h', 1000, 3 );


SELECT *
FROM   (   SELECT * ,
                  RANK() OVER ( PARTITION BY DepartmentId
                                ORDER BY Salary DESC ) AS [Pos]
           FROM   @employees ) AS tmp
WHERE  tmp.Pos <= 2;

screenshot-20190613161215.png

Dzięki za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1