如何从 table select 最大值和第二个最大值并按城市 ID 排序?

How can I select max value and second max value from table and order by city id?

我有这个员工table。 我需要编写一个 SQL 查询,它将根据城市 ID 给我带来员工的最高薪水和员工的第二高薪水(id 链接到带有城市的 table。有 5 个城市.)

我的查询如下所示:

select MAX([dbo.Employees].Salary) as Salary from [dbo.Employees] 
where [dbo.Employees].Salary not in(select MAX([dbo.Employees].Salary) from [dbo.Employees])
UNION select MAX([dbo.Employees].Salary) from [dbo.Employees] group by [dbo.Employees].Id 

我试图带来最高的并排除最高的但它应该带来总共 7 个值但它只带来 5 个。(因为有 5 个城市但第 5 个未被使用所以有 4 个城市和 2 个员工在每个城市中,除了 1 个只有 1 名员工,所以查询假设每个城市有 2 对员工 = 6,其中一个城市只有 1 名员工,所以它将带来唯一可能的价值。总计 7.)

另一个问题是我不知道如何添加 2 列 - 一个用于城市 ID,第二个用于工资本身,因为它告诉我关于分组依据的某些内容不起作用.

你可以使用ROW_NUMBER()为每个城市创建一个序列,最高的薪水取值1,第二高的取值2,等等。那么你只需要一个WHERE子句。

WITH
  ranked AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY Salary DESC)  AS city_salary_id
  FROM
    dbo.Employees
)
SELECT
  *
FROM
  ranked
WHERE
  city_salary_id IN (1, 2)

如果多人同薪并列,它会任意给你挑顺序,总是return每个城市(最多)2个员工。

ORDER BY 中添加一列可以让您更具体地了解如何处理平局,例如 ORDER BY Salary DESC, id ASC 将在平局的偶数中优先考虑最高的 id

更改为 RANK() 将使并列薪水具有相同等级,如果有并列, return 超过两名员工也会如此。