仅为MySQL中的每位员工和特定员工选择最新记录

时间:2017-12-04 14:13:44

标签: mysql sql spring spring-data-jpa greatest-n-per-group

我有一个MySQL数据库,其中有一个包含员工活动日志的表格。

+-------------------------------------------------+
| log_id | employee_id | date_time  | action_type |
+-------------------------------------------------+
|   1    |      1      | 2015/02/03 |   action1   |
|   2    |      2      | 2015/02/01 |   action1   |
|   3    |      2      | 2017/01/02 |   action2   |
|   4    |      3      | 2016/02/12 |   action1   |
|   5    |      1      | 2016/10/12 |   action2   |
+-------------------------------------------------+

我需要2个查询。首先,为每个员工做最后一次行动。因此,从这个示例表中我需要获得所有列的第3,4和5行。第二,仅针对指定员工获取最新动作。

任何想法如何实现这一目标?我正在使用Spring Data JPA,但原始SQL查询也很棒。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以通过自我加入获得预期的输出

select a.*
from demo a
left join demo b on a.employee_id = b.employee_id 
and a.date_time < b.date_time
where b.employee_id is null

请注意,如果有相同date_time的行可能需要CASE语句,而另一个属性可以决定应该选择哪一行来处理这种情况,那么它可能会为单个员工返回多行

Demo

答案 1 :(得分:1)

第一次查询。简单

SELECT t1.*
FROM tableName t1
WHERE t1.log_id = (SELECT MAX(t2.log_id)
                 FROM tableName t2
                 WHERE t2.employee_id = t1.employee_id)

第二个

SELECT t1.*
FROM tableName  t1
WHERE t1.employee_id=X and t1.log_id = (SELECT MAX(t2.log_id)
                 FROM tableName t2
                 WHERE t2.employee_id = t1.employee_id);

答案 2 :(得分:1)

为fred ed做准备...

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT employee_id
            , MAX(date_time) date_time 
         FROM my_table 
        GROUP 
           BY employee_id
     ) y 
    ON y.employee_id = x.employee_id 
   AND y.date_time = x.date_time;