如何从 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 超过两名员工也会如此。
我有这个员工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 超过两名员工也会如此。