我们有如下表格
person_id | salary
1 | 1500
1 | 1000
1 | 500
2 | 2000
2 | 1000
3 | 3000
3 | 2000
4 | 3000
4 | 1000
我们想要每个人的第二高薪。由每个人分组并获得第二高的工资。如下所示
person_id | salary
1 | 1000
2 | 1000
3 | 2000
4 | 1000
提前致谢:)
答案 0 :(得分:2)
通过使用聚合函数和自联接,您可以执行类似
的操作select a.*
from demo a
left join demo b on a.person_id = b.person_id
group by a.person_id,a.salary
having sum(a.salary < b.salary) = 1 /* 0 for highest 1 for second highest 2 for third and so on ... */
或在sum
having sum(case when a.salary < b.salary then 1 else 0 end) = 1
注意这并不像一个人可能有两个相同的工资值那样处理关系,我假设一个人的每个工资值都不同于一个人处理@juergen提到的这种案例方法的其他工资值。将使用其他案例陈述
答案 1 :(得分:2)
以下是使用exists
和having
子句
SELECT person_id,
Max(salary)
FROM Yourtable a
WHERE EXISTS (SELECT 1
FROM Yourtable b
WHERE a.person_id = b.person_id
HAVING ( a.salary < Max(b.salary)
AND Count(*) > 1 )
OR Count(Distinct salary) = 1)
GROUP BY person_id
答案 2 :(得分:1)
尝试
select t1.*
from your_table t1
join
(
select person_id,
@rank := case when person_id = @prevPersonId then @rank + 1 else 1 end as rank,
@prevPersonId := person_id
from your_table
cross join (select @rank := 0, @prevPersonId := 0) r
group by person_id
order by person_id asc, salary desc
) t2 on t1.person_id = t2.person_id
where rank = 2
答案 3 :(得分:0)
围绕 JOIN
的另一种方式。
<强>查询强>
select t1.`person_id`, max(coalesce(t2.`salary`, t1.`salary_1`)) as `salary_2` from(
select `person_id`, max(`salary`) as `salary_1`
from `your_table_name`
group by `person_id`
) t1
left join `your_table_name` t2
on t1.`person_id` = t2.`person_id`
and t1.`salary_1` <> t2.`salary`
group by t1.`person_id`;
<强> Find a sql fiddle demo here 强>
答案 4 :(得分:0)
您也可以使用
select max(salary), person_id
from (select salary, person_id from demo
except
(select max(salary), person_id from demo group by person_id)) s
group by person_id
从初始数据集中删除每个人的最高工资,然后重新开始。