【问题标题】:N(th) Highest Salary Query [duplicate]N(th) 最高工资查询 [重复]
【发布时间】:2014-01-02 08:02:14
【问题描述】:

我找到了从网络上查找第 n(th) 个最高薪水的解决方案:

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

但我无法理解查询实际上是如何执行的,即查询在每个步骤中是如何处理的,尤其是在同一个表出现多个别名的子查询中 ->

WHERE Emp2.Salary > Emp1.Salary

比较运算符用这个做什么-

WHERE (N-1) = <subquery>

有人可以帮我解决吗?

【问题讨论】:

  • 在 Mangement Studio 中,Query 下有一个名为 Display Estimated Execution PlanCtrl-L 的选项。让它成为你的朋友来回答这样的问题。 SQL-Server 将显示您必须执行的查询。

标签: mysql sql sql-server


【解决方案1】:

第 N 个最高工资是有 N-1 个更高工资的那个 例如。最高的薪水没有更高的薪水

对查询进行以下更改应该可以演示它是如何工作的:

SELECT * FROM Employee Emp1
CROSS APPLY
           (
           SELECT COUNT(DISTINCT(Emp2.Salary)) AS NHigher
           FROM Employee Emp2
           WHERE Emp2.Salary > Emp1.Salary
           ) X;

Sql Server here 的小提琴

但是请注意,大多数 RDBMS 允许 OFFSETLIMIT 类型限制,这将允许您使用普通的 ORDER BY 更有效地检索第 N 行。

例如在 SQL Server 2012 中,获取第二高的薪水:

SELECT *
FROM Employee Emp1
ORDER BY SALARY DESC
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY;

【讨论】:

    【解决方案2】:

    已编辑:这个问题是问如何获得 n(th) 最高薪水或获得最高 n(th) 薪水? 这些例子说明了如何获得 n(th) 薪水以获得最高 n(th) 只是更改第 2 行 WHERE emp.Salary =WHERE emp.Salary &gt;= :D

    有一个解决方案:

    1. 拿第N高薪

    2. 获取拥有该薪水的员工

    现在你可以用你喜欢的方式来实现它:

    第一个解决方案分组工资:

    SELECT * FROM Employee as emp
    WHERE emp.Salary = 
    (
        SELECT TOP 1 t.Salary FROM 
        (
            SELECT TOP N(th) e.Salary FROM Employee as e
            Group by e.Salary
            Order By e.Salary
        ) as t
        ORDER BY t.Salary DESC
    )
    

    第二个解决方案 DISTINCT 工资:

    SELECT * FROM Employee as emp
    WHERE emp.Salary = 
    (
        SELECT TOP 1 t.Salary FROM 
        (
            SELECT DISTINCT TOP N(th) e.Salary FROM Employee as e
            Order By e.Salary
        ) as t
        ORDER BY t.Salary DESC
    )
    

    【讨论】:

    • 问题是它是如何工作的,而不是如何去做。向该人解释如何执行查询以给出结果。他想了解方法,而不是解决方案
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多