第三高的薪水 sql
3rd highest salary sql
我尝试像这样从前 5 名员工那里获得所有 3 名最高薪水
salary
35000
34000
20000
12000
500
40000
25000
41000
90000
550000
查询
select top 5
(SELECT MAX(grosssalary) FROM Detail) maxsalary ,
(SELECT MAX(grosssalary) FROM Detail) sec_max_salary,
(SELECT MAX(grosssalary) FROM Detail
WHERE grosssalary NOT IN (SELECT MAX(grosssalary) FROM Detail )) as third_max_salary
但这显示了这样的数据
maxsalary sec_max_salary third_max_salary
550000 550000 41000
我想要这样的数据
maxsalary sec_max_salary third_max_salary
550000 90000 41000
执行 CTE
并在 salary DESC
上获取 ROWNUMBER()
并在外部查询中获取行号等于 3 的记录。
;WITH CTE AS
(
SELECT RN = ROW_NUMBER() OVER (ORDER BY salary DESC),
Salary
FROM [YourTable]
)
SELECT Salary
FROM CTE
WHERE RN <= 3
注意:如果你想要第三高的薪水使用RN=3
如果你想要所有前三名的薪水那么使用RN<=3
如果你想要前三名的最高薪水,那么你也可以这样做:
SELECT TOP 3 Salary
FROM [YourTable]
ORDER BY Salary DESC
使用 DENSE_RANK()
排序薪水,然后使用 CASE
表达式查找前 3 名薪水。
查询
;with cte as(
select [sal_rank] = dense_rank() over(
order by [grosssalary] desc
), *
from [your_table_name]
)
select max(case [sal_rank] when 1 then [grosssalary] end) as [maxsalary],
max(case [sal_rank] when 2 then [grosssalary] end) as [sec_max_salary],
max(case [sal_rank] when 3 then [grosssalary] end) as [third_max_salary]
from cte;
CREATE TABLE #A
(
salary INT
)
INSERT INTO #A VALUES
(35000),
(34000),
(20000),
(12000),
(500 ),
(40000),
(25000),
(41000),
(90000),
(550000)
select [1] maxsalary, [2] sec_max_salary, [3] third_max_salary
from (
SELECT *
FROM (
SELECT *,
RN = ROW_NUMBER() OVER (ORDER BY Salary DESC)
FROM #A
)a
WHERE RN <= 3
) src
pivot
(
MAX(SALARY)
for RN in ([1], [2], [3])
) piv;
输出
maxsalary sec_max_salary third_max_salary
550000 90000 41000
如果您使用 SQL SERVER 2012+
则使用 OFFSET
SELECT TOP 1 salary,
(SELECT salary FROM Yourtable
ORDER BY salary DESC OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY),
(SELECT salary FROM Yourtable
ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY)
FROM Yourtable
ORDER BY salary DESC
如果你只想要第三高的薪水,那么
SELECT salary
FROM yourtable
ORDER BY salary DESC
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
select *
from
( select *
from table
order by salary desc
limit 3
) as top_three
order by top_three.salary asc
limit 1
下面的代码将引导您获得第 N 个最大或最小的薪水值,而与数据类型无关,即。整数或 Vearchar。
只需更改 '<' 符号以获得更小的第 n 个值。
select * from txt_salary as t1 where 'nth largest' =
(select count(salary) from txt_salary as t2 where t1.salary<=t2.salary)
对于SQL服务器
SELECT e1.* 从 emp
e1 哪里 e1.salary =
(
select 最小值(e2.salary)
from (select top 3 DISTINCT(e3.salary) from emp
as e3 ORDER by e3.salary desc ) as e2
)
对于MYSQL
SELECT e1.* 从 emp
e1 哪里 e1.salary =
(
select 最小值(e2.salary)
from (select DISTINCT(e3.salary) from emp
as e3 ORDER by e3.salary desc limit 0,3) as e2
)
select 员工的最高工资
联盟
select max(salary) as 2nd_highest 来自员工 where salary<(select max(salary) from employee)
联盟
max(salary) as 3rd_highest from employee where salary<(select max(salary) from employee where salary< (select max(salary) from employee))=
薪水第18位=
select salary, ename, eid FROM (select e.ename, e.salary, e.eid, rank() OVER (order by e.eid desc) 等级) 排名=18
Table 姓名:-ThreeHighestSalaries
姓名--------工资
- e5 ------ 45000
- e3 -------- 30000
- e2 -------- 49000
- e4 -------- 36600
- e1 -------- 58000
- e6 -------- 58000
应该return58000,49000,45000.
1)select *,dense_rank() over(order by salary desc) as salaryrank from ThreeHighestSalaries
以上查询returns:
姓名--------工资------职级
- e1 ---------- 58000 -------- 1
- e6 -------- 58000 -------- 1
- e2 -------- 49000 -------- 2
- e5 -------- 45000 -------- 3
- e4 ---------- 36600 ---------- 4
- e3 ---------- 30000 -------- 5
2)select distinct salary from (select *,dense_rank() over(order by salary desc) as salaryrank from ThreeHighestSalaries) as temp 其中 temp.salaryrank <=3 按工资描述排序
以上查询 return 的结果为:
工资
- 58000
- 49000
- 45000
声明@tem1 table(工资整数)
插入@tem1(salary) select 按 grosssalary desc 排序的前 3 位 grosssalary
select 来自 @tem1 的前 1 sal 作为 3rdsalary order by sal asc
我尝试像这样从前 5 名员工那里获得所有 3 名最高薪水
salary
35000
34000
20000
12000
500
40000
25000
41000
90000
550000
查询
select top 5
(SELECT MAX(grosssalary) FROM Detail) maxsalary ,
(SELECT MAX(grosssalary) FROM Detail) sec_max_salary,
(SELECT MAX(grosssalary) FROM Detail
WHERE grosssalary NOT IN (SELECT MAX(grosssalary) FROM Detail )) as third_max_salary
但这显示了这样的数据
maxsalary sec_max_salary third_max_salary
550000 550000 41000
我想要这样的数据
maxsalary sec_max_salary third_max_salary
550000 90000 41000
执行 CTE
并在 salary DESC
上获取 ROWNUMBER()
并在外部查询中获取行号等于 3 的记录。
;WITH CTE AS
(
SELECT RN = ROW_NUMBER() OVER (ORDER BY salary DESC),
Salary
FROM [YourTable]
)
SELECT Salary
FROM CTE
WHERE RN <= 3
注意:如果你想要第三高的薪水使用RN=3
如果你想要所有前三名的薪水那么使用RN<=3
如果你想要前三名的最高薪水,那么你也可以这样做:
SELECT TOP 3 Salary
FROM [YourTable]
ORDER BY Salary DESC
使用 DENSE_RANK()
排序薪水,然后使用 CASE
表达式查找前 3 名薪水。
查询
;with cte as(
select [sal_rank] = dense_rank() over(
order by [grosssalary] desc
), *
from [your_table_name]
)
select max(case [sal_rank] when 1 then [grosssalary] end) as [maxsalary],
max(case [sal_rank] when 2 then [grosssalary] end) as [sec_max_salary],
max(case [sal_rank] when 3 then [grosssalary] end) as [third_max_salary]
from cte;
CREATE TABLE #A
(
salary INT
)
INSERT INTO #A VALUES
(35000),
(34000),
(20000),
(12000),
(500 ),
(40000),
(25000),
(41000),
(90000),
(550000)
select [1] maxsalary, [2] sec_max_salary, [3] third_max_salary
from (
SELECT *
FROM (
SELECT *,
RN = ROW_NUMBER() OVER (ORDER BY Salary DESC)
FROM #A
)a
WHERE RN <= 3
) src
pivot
(
MAX(SALARY)
for RN in ([1], [2], [3])
) piv;
输出
maxsalary sec_max_salary third_max_salary
550000 90000 41000
如果您使用 SQL SERVER 2012+
则使用 OFFSET
SELECT TOP 1 salary,
(SELECT salary FROM Yourtable
ORDER BY salary DESC OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY),
(SELECT salary FROM Yourtable
ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY)
FROM Yourtable
ORDER BY salary DESC
如果你只想要第三高的薪水,那么
SELECT salary
FROM yourtable
ORDER BY salary DESC
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
select *
from
( select *
from table
order by salary desc
limit 3
) as top_three
order by top_three.salary asc
limit 1
下面的代码将引导您获得第 N 个最大或最小的薪水值,而与数据类型无关,即。整数或 Vearchar。 只需更改 '<' 符号以获得更小的第 n 个值。
select * from txt_salary as t1 where 'nth largest' =
(select count(salary) from txt_salary as t2 where t1.salary<=t2.salary)
对于SQL服务器
SELECT e1.* 从 emp
e1 哪里 e1.salary =
(
select 最小值(e2.salary)
from (select top 3 DISTINCT(e3.salary) from emp
as e3 ORDER by e3.salary desc ) as e2
)
对于MYSQL
SELECT e1.* 从 emp
e1 哪里 e1.salary =
(
select 最小值(e2.salary)
from (select DISTINCT(e3.salary) from emp
as e3 ORDER by e3.salary desc limit 0,3) as e2
)
select 员工的最高工资
联盟
select max(salary) as 2nd_highest 来自员工 where salary<(select max(salary) from employee)
联盟
max(salary) as 3rd_highest from employee where salary<(select max(salary) from employee where salary< (select max(salary) from employee))=
薪水第18位=
select salary, ename, eid FROM (select e.ename, e.salary, e.eid, rank() OVER (order by e.eid desc) 等级) 排名=18
Table 姓名:-ThreeHighestSalaries
姓名--------工资
- e5 ------ 45000
- e3 -------- 30000
- e2 -------- 49000
- e4 -------- 36600
- e1 -------- 58000
- e6 -------- 58000
应该return58000,49000,45000.
1)select *,dense_rank() over(order by salary desc) as salaryrank from ThreeHighestSalaries
以上查询returns:
姓名--------工资------职级
- e1 ---------- 58000 -------- 1
- e6 -------- 58000 -------- 1
- e2 -------- 49000 -------- 2
- e5 -------- 45000 -------- 3
- e4 ---------- 36600 ---------- 4
- e3 ---------- 30000 -------- 5
2)select distinct salary from (select *,dense_rank() over(order by salary desc) as salaryrank from ThreeHighestSalaries) as temp 其中 temp.salaryrank <=3 按工资描述排序
以上查询 return 的结果为:
工资
- 58000
- 49000
- 45000
声明@tem1 table(工资整数)
插入@tem1(salary) select 按 grosssalary desc 排序的前 3 位 grosssalary
select 来自 @tem1 的前 1 sal 作为 3rdsalary order by sal asc