第三高的薪水 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