使用 ROW_NUMBER() 查找 Sql 服务器中第二高的

Using ROW_NUMBER() to find the second highest in Sql Server

有这个查询(见下文): 我希望能够使用 ROW_NUMBER() 函数来 return 薪水第二高的记录。我知道如何使用该函数,但由于我有一个子查询,所以不知道该把它放在哪里。

查询returns:

Yuriana Hagasawa    NULL    China   Project Manager 56000.00
Venessa Katarina    Cameron Denmark     Tech Lead   185000.00
Sahi    King    NULL    Denmark     Design Engineer 156000.00
Chen    Chen    NULL    Andorra     Project Manager 76000.00

所以,使用行号功能我只想 return sahi king 的记录。谢谢

SELECT C.[First Name],
C.[Last Name],
C.[Middle Name],
C.[Country Name],
C.[Designation Name],
Salary.Emp_Salary AS 'Current Salary'
    FROM
    (
    SELECT
        Emp_First_Name AS "First Name",
        Emp_Last_Name AS "Last Name",
        Emp_Middle_Name AS "Middle Name",
        Country_Name AS "Country Name",
        Desig_Name as "Designation Name",
        MAX(Emp_Salary_Change_Year) AS "Change Year"

        FROM Employee_Details AS e

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id

    GROUP BY Emp_First_Name, Emp_Last_Name,
    Emp_Middle_Name, Country_Name, Desig_Name) AS C
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year;

您可以尝试使用 ROW_NUMBERORDER BY Salary.Emp_Salary DESC,如下所示,如果您只需要第二高的,则在下面添加 where 条件 WHERE RowNo = 2

SELECT * FROM (
SELECT C.[First Name],
    C.[Last Name],
    C.[Middle Name],
    C.[Country Name],
    C.[Designation Name],
    Salary.Emp_Salary AS 'Current Salary',
    ROW_NUMBER() OVER (ORDER BY Salary.Emp_Salary DESC) As RowNo
        FROM
        (
        SELECT
            Emp_First_Name AS "First Name",
            Emp_Last_Name AS "Last Name",
            Emp_Middle_Name AS "Middle Name",
            Country_Name AS "Country Name",
            Desig_Name as "Designation Name",
            MAX(Emp_Salary_Change_Year) AS "Change Year"

            FROM Employee_Details AS e

        INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
        INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
        INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
        INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id

        GROUP BY Emp_First_Name, Emp_Last_Name,
        Emp_Middle_Name, Country_Name, Desig_Name) AS C
        INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year) t
WHERE RowNo = 2;