Assuming you don't care about ties, something like this should work:
WITH RankedEmployees As
(
SELECT
EmpId,
EmpName,
Esal,
DeptId,
ROW_NUMBER() OVER (PARTITION BY DeptId ORDER BY Esal DESC) As RN
FROM
Emp
)
SELECT
E.EmpId,
E.EmpName,
E.Esal,
D.DName
FROM
Dept As D
INNER JOIN RankedEmployees As E
ON E.DeptID = D.DeptId
And E.RN = 1
;
If you
do want to show ties, replace
ROW_NUMBER
with
RANK
.
ROW_NUMBER[
^]
RANK[
^]