获得mysql

时间:2018-01-11 10:37:22

标签: mysql sql

我们有如下表格

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

提前致谢:)

5 个答案:

答案 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

Demo

  

注意这并不像一个人可能有两个相同的工资值那样处理关系,我假设一个人的每个工资值都不同于一个人处理@juergen提到的这种案例方法的其他工资值。将使用其他案例陈述

答案 1 :(得分:2)

以下是使用existshaving子句

的一种方法
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

从初始数据集中删除每个人的最高工资,然后重新开始。