我找到了一个从网络上找到第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>有没有人能帮我一下?
发布于 2014-01-02 16:20:39
第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的小提琴
但是请注意,大多数关系型数据库都允许OFFSET和LIMIT类型限制,这将允许您使用普通的ORDER BY更有效地检索第N行。
例如,在SQL Server 2012中,要获取第二高的薪水:
SELECT *
FROM Employee Emp1
ORDER BY SALARY DESC
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY;发布于 2014-01-02 17:02:47
编辑:这个问题是问如何获得n(th)最高的薪水或前n(th)薪水?下面的示例说明了如何获得前n(th)个薪水只需将第2行WHERE emp.Salary =更改为WHERE emp.Salary >= :D
对此有一种解决方案:
现在你可以用你喜欢的方式来实现它:
第一个解决方案分组工资:
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
)第二种解决方案不同的薪水:
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
)https://stackoverflow.com/questions/20878714
复制相似问题