首页 > 解决方案 > 直接使用row_number函数

问题描述

有没有直接使用row_number()函数的方法?我想找到第二高的薪水

SELECT DISTINCT id
    ,salary
    ,depid
    ,ROW_NUMBER() OVER (
        PARTITION BY depid ORDER BY salary DESC
        ) AS rownum
FROM emp
WHERE rownum = 2;

它给出了一个错误,但是下面的代码工作正常。

SELECT *
FROM (
    SELECT DISTINCT id
        ,salary
        ,depid
        ,ROW_NUMBER() OVER (
            PARTITION BY depid ORDER BY salary DESC
            ) AS rownum
    FROM emp
    ) AS t
WHERE t.rownum = 2;

有什么方法可以直接使用row_number()第一个选项中的函数,这会导致错误?

标签: sqlsql-server

解决方案


您不能将同一查询的别名用作 where 子句的条件。您也不能在 where 子句中使用窗口查询作为传递条件。

这是一个详细的解释为什么 where 子句中没有窗口函数?. 因此,您需要内部查询之外的另一个查询,并且需要编写子查询。

您可以从以下查询中获得 SQL Server 中第 N 高的薪水。

SELECT TOP 1 salary
FROM (
    SELECT DISTINCT TOP N salary
    FROM <YourTableNameHere>
    ORDER BY salary DESC
    ) AS TEMP
ORDER BY salary

推荐阅读