如何获取所选组的最新N记录

时间:2015-09-23 11:43:25

标签: mysql sql date group-by sql-order-by

我想在MySql version 5.1.9上运行一个查询,该查询只返回选定部门的前两名(由JoiningDate排序)。

例如,我的数据如下:

+-------+------------------------------------------+----------+------------+
| empid | title                                    | Dept     | JoiningDate|
+-------+------------------------------------------+----------+------------+
|   1   | Research and Development                 | 1        | 2015-08-06 |
|   2   | Consultant                               | 2        | 2015-08-06 |
|   3   | Medical Consultant                       | 3        | 2015-08-06 |
|   4   | Officer                                  | 4        | 2015-08-06 |
|   5   | English Translator                       | 5        | 2015-08-06 |
|   6   | Teacher                                  | 1        | 2015-08-01 |
|   7   | Physical Education                       | 2        | 2015-08-01 |
|   8   | Accountant                               | 3        | 2015-08-01 |
|   9   | Science Teacher                          | 4        | 2015-08-01 |
|  10   | Home Science                             | 5        | 2015-08-01 |
|  11   | Research Assistant                       | 1        | 2015-08-05 |
|  12   | Consultant                               | 2        | 2015-08-05 |
|  13   | Consultant HR                            | 3        | 2015-08-05 |
|  14   | Technical Lead                           | 4        | 2015-08-05 |
|  15   | Hindi Translator                         | 5        | 2015-08-05 |
|  16   | Urdu Teacher                             | 1        | 2015-08-02 |
|  17   | Physical Education                       | 2        | 2015-08-02 |
|  18   | Accountant                               | 3        | 2015-08-02 |
|  19   | Science                                  | 4        | 2015-08-02 |
|  20   | Home Science                             | 5        | 2015-08-02 |
+-------+------------------------------------------+----------+------------+

我希望查询输出最近加入的两个部门(1,2,3),即:

+-------+------------------------------------------+----------+------------+
| empid | title                                    | Dept     | JoiningDate|
+-------+------------------------------------------+----------+------------+
|   1   | Research and Development                 | 1        | 2015-08-06 |
|  11   | Research Assistant                       | 1        | 2015-08-05 |
|   2   | Consultant                               | 2        | 2015-08-06 |
|  12   | Consultant                               | 2        | 2015-08-05 |
|   3   | Medical Consultant                       | 3        | 2015-08-06 |
|  13   | Consultant HR                            | 3        | 2015-08-05 |
+-------+------------------------------------------+----------+------------+

3 个答案:

答案 0 :(得分:1)

在mysql中,您可以使用用户定义的变量来实现所需的结果

SELECT 
t.empid,
t.title,
t.Dept,
t.JoiningDate
FROM
(
    SELECT 
    *,
    @r:= CASE WHEN @g = b.Dept THEN @r + 1 ELSE 1 END rounum,
    @g:= b.Dept
    FROM (
        SELECT * 
        FROM table1 
        CROSS JOIN (SELECT @r:= NULL,@g:=NULL) a
        WHERE Dept IN(1,2,3)
        ORDER BY Dept,JoiningDate DESC
    ) b
) t
WHERE t.rounum <=2

DEMO

答案 1 :(得分:0)

使用相关子选择来计算具有相同日期但后来的JoiningDate的行数。如果小于2,则返回该行。

select empid, title, Dept, JoiningDate
from tablename t1
where (select count(*) from tablename t2
       where t2.Dept = t1.Dept
         and t2.JoiningDate > t1.JoiningDate) < 2

答案 2 :(得分:0)

<强>查询

select *
from emp_ t1
where 
(
    select count(*) from emp_ t2
    where t2.Dept = t1.Dept
    and t2.JoiningDate > t1.JoiningDate
) <= 1
and t1.Dept in (1,2,3)
order by t1.Dept;

SQL Fiddle

也可以通过提供一个rownumber来实现它。

<强>查询

select t2.empid,
t2.title,
t2.Dept,
t2.JoiningDate
from
(
   select empid,
   title,
   Dept,
   JoiningDate,
   ( 
       case Dept 
       when @curA
       then @curRow := @curRow + 1 
       else @curRow := 1 and @curA := Dept end
    )  as rn
    from employee t,
    (select @curRow := 0, @curA := '') r
    where Dept in (1,2,3)
    order by Dept,JoiningDate desc
)t2
where rn < 3;

SQL Fiddle