У меня есть таблица EmpDetails
:
DeptID EmpName Salary
Engg Sam 1000
Engg Smith 2000
HR Denis 1500
HR Danny 3000
IT David 2000
IT John 3000
Мне нужно сделать запрос, чтобы найти самую высокую зарплату для каждого отдела.
with ctesal as (
select DepartmentId , Name , Salary, ROW_Number() OVER (partition by DepartmentId
order by Salary desc) as RowNum
from dbo.Employee
)
select DepartmentId , Name , Salary , RowNum from ctesal where RowNum =2;
Это применимо к серверу SQL. ROW_Number - это встроенная функция в SQL-сервере. Он дает счет, начиная с 1, в зависимости от разбиения по и по порядку. В конце концов, мы можем написать, где условие на основе наших требований.
Если вы просто хотите получить самую высокую зарплату из этой таблицы, по отделам:
SELECT MAX(Salary) FROM TableName GROUP BY DeptID
Использовать коррелированный подзапрос:
SELECT DeptID, EmpName, Salary
FROM EmpDetails a
WHERE Salary = (SELECT MAX(Salary)
FROM EmpDetails b
WHERE a.DeptID = b.DeptID)
Это наилучшее из возможных решений для ORACLE:
Select * from (select customerid, city, freight,
row_number() over (partition by customerid order by freight desc) Row_Number from
(select orders.orderId, customers.CUSTOMERID, customers.city, orders.FREIGHT from orders inner join customers on orders.customerid = customers.customerid where customers.country='Germany' order by customers.customerid, orders.freight desc)
order by customerid, freight desc) where Row_Number<=2;
. Обратите внимание, здесь я использовал разделение по выражению для маркировки номера строки, главным образом потому, что нам нужно разделить записи, группируя их по идентификатору клиента. , Я использовал два внутренних запроса здесь. Самый внутренний запрос состоит в том, чтобы дать представление, которое сортируется в соответствии с идентификатором клиента и уменьшением порядка стоимости. Теперь мы должны всегда получать две верхние записи, поэтому сначала нам нужно назвать их, а затем отфильтровать по rownum. Запрос второго уровня - пометить rownum в соответствии с идентификатором клиента. И последний запрос отфильтрует результат в соответствии с rownum. Для каждого раздела.
Эрмн, что-то вроде:
select
d.DeptID,
max(e.Salary)
from
department d
inner join employees e on d.DeptID = e.DeptID
group by
d.DeptID
Используйте следующую команду;
SELECT A.*
FROM @EmpDetails A
INNER JOIN ( SELECT DeptID ,
MAX(salary) AS salary
FROM @EmpDetails
GROUP BY DeptID
) B ON A.DeptID = B.DeptID
AND A.salary = B.salary
ORDER BY A.DeptID
SELECT empname
FROM empdetails
WHERE salary IN(SELECT deptid max(salary) AS salary
FROM empdetails
group by deptid)
SELECT D.DeptID, E.EmpName, E.Salary
FROM Employee E
INNER JOIN Department D ON D.DeptId = E.DeptId
WHERE E.Salary IN (SELECT MAX(Salary) FROM Employee);
SELECT empName,empDept,EmpSalary
FROM Employee
WHERE empSalary IN
(SELECT max(empSalary) AS salary
From Employee
GROUP BY EmpDept)
Select empname,empid,Sal,DeptName from
(Select e.empname,e.empid,Max(S.Salary) Sal,D.DeptName, ROW_NUMBER() Over(partition by D.DeptName order by s.salary desc) Rownum
from emp e inner join Sal S
on e.empid=s.empid
inner join Dept d on e.Deptid=d.Deptid
group by e.empname,e.empid,D.DeptName,s.Salary
) x where Rownum = 1