为每个员工选择一天中最早时间戳的完整记录[重复]

Posted

技术标签:

【中文标题】为每个员工选择一天中最早时间戳的完整记录[重复]【英文标题】:Select complete record with earliest timestamp on a day for each employee [duplicate] 【发布时间】:2020-11-03 05:15:24 【问题描述】:

我有一个表,根据员工 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   |
+----+-----------+--------------------------------------+-------------+-----------------------+

【问题讨论】:

问题已被标记为重复,但它与提到的重复不同,因为每天都有子分组。 【参考方案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)
)

【讨论】:

【参考方案2】:

如何让每个员工每天最早进入

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

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,则可以使用窗口函数:

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

【讨论】:

以上是关于为每个员工选择一天中最早时间戳的完整记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

简单的sql分组统计

一天中每小时的 SQL 最大并发会话数

使用 pandas 的滚动窗口计算一天中每个时间的平均值

Firebase函数在一天中的特定时间重置值[重复]

获取每组只有 1 条记录的记录

SQL 按天分解不完整记录多长时间