-3

我的表名 emp :

表数据具有以下内容:

   id    name dep_id salary
    1      x     10    2000
    2      y     20    3000
    3      z     30    1000
    4      c     40    500
    5      xc    50    100
    6      b     60    10
    7      l     70    4000
    8      m     80    5000
    9      n     90    10000
    10     dd    100   100
    11      gg    20    4000
    12      vv    10    2000

我的要求是显示每个部门最高两个薪水的员工详细信息。

4

2 回答 2

0

查询

select e.* 
from emp e
inner join (
              SELECT 
              dep_id,
              salary,
              ( 
                CASE dep_id 
                WHEN @curType 
                THEN @curRow := @curRow + 1 
                ELSE @curRow := 1
                AND @curType := dep_id END
                )AS sequence_No
                FROM emp, 
                (SELECT @curRow := 0, @curType := '') r
                ORDER BY  dep_id,salary desc 
)t on t.dep_id=e.dep_id and t.salary=e.salary
where t.sequence_No<=2

结果

| ID | NAME | DEP_ID | SALARY |
|----|------|--------|--------|
| 13 |   xx |     10 |   5000 |
|  1 |    x |     10 |   2000 |
| 12 |   vv |     10 |   2000 |
| 11 |   gg |     20 |   4000 |
|  2 |    y |     20 |   3000 |
|  3 |    z |     30 |   1000 |
|  4 |    c |     40 |    500 |
|  5 |   xc |     50 |    100 |
|  6 |    b |     60 |     10 |
|  7 |    l |     70 |   4000 |
|  8 |    m |     80 |   5000 |
|  9 |    n |     90 |  10000 |
| 10 |   dd |    100 |    100 |
于 2013-10-04T08:59:06.753 回答
0

这是一种方法,但我希望如果这是为了测试,他们不会相信你写的:-

SELECT id, name, dep_id, salary
FROM
(
    SELECT id, name, dep_id, salary, @DepCnt := IF(@Dep=dep_id, @DepCnt + 1, 1) AS DepartmentCounter, @Dep:=dep_id
    FROM
    (
        SELECT id, name, dep_id, salary
        FROM emp
        ORDER BY dep_id, salary DESC
    ) a
    CROSS JOIN (SELECT @DepCnt:=1, @Dep:=0) Sub1
) Sub2
WHERE DepartmentCounter <= 2

内部选择按部门顺序获取所有行,然后在其中递减薪水。

然后下一个外部选择为每一行添加一个计数器,从 1 开始,每个部门工资最高的行。

然后外部选择只获取计数器为 1 或 2 的那些。

它的 SQLfiddle 示例:-

http://sqlfiddle.com/#!2/3643e/1

编辑 - 如果超过 1 人的薪水相同,这是前 2 名薪水之一,则扩展为带回详细信息:-

SELECT id, name, dep_id, salary
FROM
(
    SELECT id, name, dep_id, salary, @DepCnt := IF(@Dep=dep_id, IF(@PrevSalary=salary, @DepCnt, @DepCnt + 1), 1) AS DepartmentCounter, @Dep:=dep_id, @PrevSalary:=salary
    FROM
    (
        SELECT id, name, dep_id, salary
        FROM emp
        ORDER BY dep_id, salary DESC
    ) a
    CROSS JOIN (SELECT @DepCnt:=1, @Dep:=0, @PrevSalary:=0) Sub1
) Sub2
WHERE DepartmentCounter <= 2
于 2013-10-04T08:46:41.930 回答