如何从薪水表中找到第三或第n个最高薪水?


Answers:


82

使用ROW_NUMBER(如果要一个)或DENSE_RANK(对于所有相关行):

WITH CTE AS
(
    SELECT EmpID, EmpName, EmpSalary,
           RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
    FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow

如何从表中获取最低工资记录?从cmn_pat_x_insurance ins中选择ins.KYS_ID,ins.FKYS_INS_ID ins其中ins.FKYS_PAT_ID ='1253_717'和ins.FKYS_INS_TYPE in(1)以及ins.BOL_TYPE in(1,3)和ins.salary in(min(ins。
saidesh kilaru 2013年

想象一下,雇员表中有10,0000条记录。如果使用上述查询,性能将降低6-10倍。
Bimal Das

1
@BimalDas:则该EmpSalary列上没有索引。另外,相比之下减少了什么?该ROW_NUMBER方法的优点是可以使用..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)。因此,您可以使用它来获取组,但仍可以访问它的任何列。
蒂姆·施密特

@TimSchmelter WITH CTE将创建一个临时表以将第一个SELECT语句的全部数据存储到其中,然后从结果中选择“ SELECT EmpID,EmpName,EmpSalary FROM CTE WHERE RN = @NthRow”。这就是为什么我认为它有点慢。我检查了 而且我也有适当的索引。
Bimal Das

2
@BimalDas:不,它不是在创建临时表。通常不会在任何地方实现cte。它更像是内联视图或命名子查询。
蒂姆·舒默尔

88

行号:

SELECT Salary,EmpName
FROM
  (
   SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
   FROM EMPLOYEE
   ) As A
WHERE A.RowNum IN (2,3)

子查询:

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
               SELECT COUNT(DISTINCT(Emp2.Salary))
               FROM Employee Emp2
               WHERE Emp2.Salary > Emp1.Salary
               )

热门关键字:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary

如何从表中获取最低工资记录?从cmn_pat_x_insurance ins中选择ins.KYS_ID,ins.FKYS_INS_ID ins其中ins.FKYS_PAT_ID ='1253_717'和ins.FKYS_INS_TYPE in(1)以及ins.BOL_TYPE in(1,3)和ins.salary in(min(ins。
saidesh kilaru 2013年

Kumar和Alexander,我想再加上一个领域,该怎么做?我的查询是像“” “选择顶层1 NoteID从(选择则DateDiff(年,SchedualDate,CURRENT_TIMESTAMP)作为NoteAge,鲜明的前3 NoteID从[DBO] [DocSecheduale]排序NoteID说明。)的订单,通过NoteID” “”
Zaveed Abbasi 2014年

我发现薪水排名第n位,但我越来越了解子查询,您想解释
一下子

@deepak_java每次外部查询处理一行时,都会对子查询进行评估。换句话说,内部查询不能独立于外部查询进行处理,因为内部查询也使用Emp1值。
Kumar Manish 2015年

了解其... WHERE (N-1) = (Subquery)...工作原理很重要。子查询是一个相关查询,因为其WHERE子句Emp1从主查询中使用。每次主查询扫描一行时都会评估子查询。例如,如果我们要从(800,1000,700,750)中找到第三大薪水(N = 3),则第一行的子查询将为SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000。对于第四薪水值(750)... WHERE Emp2.Salary > 750将为2,即N -1,因此将返回此行。
jerrymouse

65

试试这个

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

对于3,您可以替换任何值...


这适用于oracle 10g或11g吗?还是有类似的替代品?
RBz

40

如果要使用TOP关键字优化方法,那么第n个最高和最低薪水查询如下,但通过使用聚合函数名称,查询看起来像一个棘手的逆序查询:

N最高工资:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

例如:最高工资3:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

N最低工资:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

例如:最低工资3:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)

最简单,最容易记住。+1
Sнаđошƒаӽ

4
要获得为什么我们按ASC顺序进行工作的最高薪水,必须按DESC顺序进行,如果我们有这样的薪水7000,10000,11000,500,800,900,12000,则排序的内部查询将导致top3表示500,800,900和最大的这些是900,但900不是最多3个,最多3个工资是10000
纳伦德拉Jaggi

1
例如:3个最高薪水:必须像从薪水中选择MIN(EmpSalary)薪水在IN(从薪水顺序中选择SELECT TOP 3 EmpSalary by EmpSalary DESC)
Jimit Rupani

15

如果使用子查询,则太简单了!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

您可以在LIMIT约束后更改第n个值。

在此子查询中,按EmpSalary DESC限制3从员工订单中选择EmpSalary;将返回员工的前三名薪水。从结果中,我们将使用MIN命令选择最低薪水,以获取员工的第三名TOP薪水。


收到此错误。错误代码:1248每个派生表必须具有自己的别名

从(Employee的SELECT EmpSalary ORDER BY EmpSalary DESC LIMIT 3)中选择SELECT MIN(EmpSalary)作为s;
anonxss

只需使用DISTINCT来避免重复(SELECT MIN(EmpSalary)来自(雇员的SELECT DISTINCT(EmpSalary)ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh

14

用您的最大号码替换N

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

说明

如果您之前没有看到过类似的查询,则上面的查询可能会非常令人困惑-内部查询称为相关子查询,因为内部查询(子查询)使用外部查询的值(在这种情况下为Emp1表) )的WHERE子句中。

来源


+1了解为什么会... WHERE (N-1) = (Subquery)...起作用很重要。子查询是一个相关查询,因为其WHERE子句Emp1从主查询中使用。每次主查询扫描一行时都会评估子查询。例如,如果我们要从(800,1000,700,750)中找到第三大薪水(N = 3),则第一行的子查询将为SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000。对于第四薪水值(750)... WHERE Emp2.Salary > 750将为2,即N -1,因此将返回此行。
jerrymouse

13

不使用子查询的薪水表中的第三或第n个最高薪水

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

对于第三高薪,用2代替N-1


3
值得一提的是,SQL Server 2012 +版本提供了OFFSET FETCH。
Zerotoinfinity 2015年

11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3

1
感谢DENSE_RANK()我从未听说过
Vivekh,2015年

8

请参考以下查询以获得第n个最高薪水。通过这种方式,您在MYSQL中获得了第n高的薪水。如果您只想获得第n个最低工资,则需要在查询中将DESC替换为ASC。 最高薪水


1
问题是关于SQL Server而不是MySQL。
bummi 2014年


6

方法1:

SELECT TOP 1 salary FROM (
SELECT TOP 3 salary 
 FROM employees 
  ORDER BY salary DESC) AS emp 
 ORDER BY salary ASC

方法2:

  Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

方法1可以排序:从SELECT TOP 1 SALARY(从雇员中选择TOP 3 SALARY)*原因
Ashish Agrawal Yodlee

5

在2008年,我们可以使用ROW_NUMBER()OVER(按EmpSalary DESC排序)来获得没有可使用关系的等级。

例如,我们可以通过这种方式获得第8位,或者将@N更改为其他值,或者根据需要将其用作函数中的参数。

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

您可能知道,在SQL Server 2012中,这是使用LAG()更直观地执行的。



3

这是任何SQL面试中的热门问题之一。我将写下不同的查询以找出列的第n个最高值。

通过运行以下脚本,我创建了一个名为“员工”的表。

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

现在,我将通过在insert语句下面运行,将8行插入此表中。

insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)

现在,我们将使用不同的查询从上表中找出第三高的Basic_sal。我在Management Studio中运行了以下查询,以下是结果。

select * from Employee order by Basic_Sal desc

我们可以从上图中看到,第三高的基本薪水是8500。我正在写3种不同的方法来做同样的事情。通过运行下面提到的所有三个查询,我们将得到相同的结果,即8500。

第一种方法:-使用行号功能

select Ename,Basic_sal
from(
            select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
      )A
where rowid=2

3
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

我的薪水排名第三



3

-最高薪水

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

-(第-1名)最高薪水

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )






1

经过MySQL测试的解决方案,假设N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

另一个例子:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);


1
select * from employee order by salary desc;

+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+




select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

将n替换为第n个最高薪水。



0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

对于第二高薪,在上面的查询中将3更改为2,将第N高薪更改为N,其中N = 1,2,3,4...。


0

SELECT * FROM(按薪资DESC选择与客户订单不同的薪资)限制4,1;

限制4,1表示离开前4行,然后选择下一行。

限制和行号取决于您使用的平台。

试试这个,它将起作用。


0

注意:请用任何第N个整数替换查询中的偏移3

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

描述

仅获取下1行

仅返回1行

偏移3行

排除前3条记录在这里您可以输入任何整数


0

子查询总是需要更多时间:

使用以下查询获取任何最高和最低数据:

最高数据: select *from business order by id desc limit 3,1;

最低数据: select *from business order by id asc limit 3,1;

可以使用N代替3获得第n个数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.