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
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;
0
Marcin.Miga napisał(a):
Jaki DBMS?
MySQL
0
Marcin.Miga napisał(a):
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;
Dzięki za odpowiedź.