使用 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_NUMBER
和 ORDER 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;
有这个查询(见下文): 我希望能够使用 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_NUMBER
和 ORDER 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;