Select 完整记录每个员工一天中最早的时间戳

Select complete record with earliest timestamp on a day for each employee

我有一个 table 可以根据员工 ID 存储员工的面部登录数据。我需要让每个员工在一天中最早登录,并忽略所有其他登录。我知道如何获取每位员工的最新或最早记录,但我无法弄清楚如何获取每位员工每天最早的记录。

+----+-----------+--------------------------------------+-------------+-----------------------+
| id | camera_id |              image_name              | employee_id |      created_at       |
+----+-----------+--------------------------------------+-------------+-----------------------+
| 10 |         2 | pjcc7vf142pec6li7k8kqxuqvnmhm0tyo8ib |          16 | 2020-07-11 10:40:20   |
| 11 |         2 | 9iizfdtk3m81a745ut7tzqzqh8kf9ipz2u02 |           2 | 2020-07-11 10:40:22   |
| 14 |         2 | 3p74yrq35nfaazwdo8auguvn2h5hpugtfvvw |           2 | 2020-07-11 12:07:24   |
| 15 |         2 | hpa2am40ufke7o7q2y733hh83h7ykxxdgkof |          16 | 2020-07-11 12:09:35   |
| 16 |         2 | g7adgyzloab2t4z7xx2id0a9cjqx8ojfni99 |           2 | 2020-07-11 12:09:41   |
| 17 |         2 | tapufkiuj5toxfdoikjicbe3k7tl32yj5khp |          16 | 2020-07-12 12:09:47   |
| 18 |         2 | pjcc7vf142pec6li7k8kqxuqvnmhm0tyo8ib |          16 | 2020-07-12 14:40:20   |
| 19 |         2 | 9iizfdtk3m81a745ut7tzqzqh8kf9ipz2u02 |           2 | 2020-07-12 15:40:22   |
| 20 |         2 | 3p74yrq35nfaazwdo8auguvn2h5hpugtfvvw |           2 | 2020-07-12 16:07:24   |
| 21 |         2 | hpa2am40ufke7o7q2y733hh83h7ykxxdgkof |          16 | 2020-07-12 17:09:35   |
| 22 |         2 | g7adgyzloab2t4z7xx2id0a9cjqx8ojfni99 |           2 | 2020-07-13 12:09:41   |
+----+-----------+--------------------------------------+-------------+-----------------------+

结果如下所示...

+----+-----------+--------------------------------------+-------------+-----------------------+
| id | camera_id |              image_name              | employee_id |      created_at       |
+----+-----------+--------------------------------------+-------------+-----------------------+
| 10 |         2 | pjcc7vf142pec6li7k8kqxuqvnmhm0tyo8ib |          16 | 2020-07-11 10:40:20   |
| 11 |         2 | 9iizfdtk3m81a745ut7tzqzqh8kf9ipz2u02 |           2 | 2020-07-11 10:40:22   |
| 17 |         2 | tapufkiuj5toxfdoikjicbe3k7tl32yj5khp |          16 | 2020-07-12 12:09:47   |
| 19 |         2 | 9iizfdtk3m81a745ut7tzqzqh8kf9ipz2u02 |           2 | 2020-07-12 15:40:22   |
| 22 |         2 | g7adgyzloab2t4z7xx2id0a9cjqx8ojfni99 |           2 | 2020-07-13 12:09:41   |
+----+-----------+--------------------------------------+-------------+-----------------------+

how to get earliest entry in each day by each employee

您可以使用相关子查询进行过滤:

select t.*
from mytable t
where t.created_at = (
    select min(t1.created_at)
    from mytable t1
    where 
        t1.employee_id    =  t.employee_id 
        and t1.created_at >= date(t.created_at)
        and t1.created_at <  date(t.created_at) + interval 1 day
)

此查询将利用 (employee_id, created_at) 上的索引。

或者,如果你是 运行 MySQL 8.0,你可以使用 window 功能:

select *
from (
    select 
        t.*,
        row_number() over(
            partition by employee_id, date(created_at) 
            order by created_at
        ) rn
    from mytable t
) t
where rn = 1

你可以这样做:

select *
from t
where (employee_id, created_at) in (
  select employee_id, min(created_at)
  from t
  group by employee_id, date(created_at)
)