【问题标题】:How to get Latest N Records of selected Group如何获取所选组的最新 N 条记录
【发布时间】:2015-09-23 11:43:24
【问题描述】:

我想在MySql version 5.1.9 上运行一个查询,它只返回我所选部门的前两个(按加入日期排序)

比如我的数据是这样的:

+-------+------------------------------------------+----------+------------+
| 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,即:

+-------+------------------------------------------+----------+------------+
| 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 |
+-------+------------------------------------------+----------+------------+

【问题讨论】:

  • JoiningDate 订购吧?
  • 为示例数据创建一个 sql-fiddle。

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


【解决方案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

【讨论】:

    【解决方案2】:

    使用相关的子选择来计算日期相同但加入日期更晚的行数。如果小于 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
    

    【讨论】:

      【解决方案3】:

      查询

      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


      也可以通过给出行号来实现。

      查询

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-26
        • 2022-12-07
        • 1970-01-01
        • 2015-04-29
        • 2011-05-24
        • 2010-09-30
        相关资源
        最近更新 更多