我有一个表,其中包含不同行中员工、办公室入口和出口的访问控制数据。输出基于日期和时间范围示例中的查询 ac_date >= '2018-05-12' AND ac_date <= '2018-05-13' AND ac_time >='08:00:00' AND ac_time <= '13:00:00']
表ac
CREATE TABLE `AC` (
`employee` int(11) NOT NULL,
`ac_date` date NOT NULL,
`ac_time` time NOT NULL,
`ac_event` tinyint(4) NOT NULL,
KEY `index2` (`employee`,`ac_date`,`ac_time`,`ac_event`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Employee ac_date ac_time ac_event
2032 2018-05-12 08:52:00 1
2032 2018-05-12 11:39:33 0
2032 2018-05-12 11:48:06 1
2032 2018-05-12 11:52:54 0
2032 2018-05-12 11:59:54 1
2032 2018-05-12 12:23:40 0
2032 2018-05-13 08:34:43 1
2032 2018-05-13 09:02:25 0
2032 2018-05-13 09:12:16 1
2032 2018-05-13 11:45:21 0
2032 2018-05-13 12:50:40 1
2032 2018-05-13 12:52:16 0
其中ac_uevent=1是输入,ac event=0是输出。
我需要做一个查询,显示在同一行(入口/出口)的数据,然后采取的时间,该员工离开办公室。ej公司:
第一个块的输出:
Employee entry_date exit_date entry_date exit_date duration
2032 2018-05-12 2018-05-12 08:52:00 11:39:33 02:47:33
我可以通过对同一个表执行查询来获得结果,但是我有重复的数据,所以我必须在[ac\u date,ac\u time]之前求助于组。我不知道我尝试的方法是否正确,所以我想看看Maven的解决方案。谢谢您!
update:http://sqlfiddle.com/#!9/6楼/3
5条答案
按热度按时间xqnpmsa81#
试试这个:
tpxzln5u2#
可以使用相关子查询来获取入口/出口对:
输出:
然后可以使用timestampdiff来计算每次进入-退出之间的时间:
此处演示
js81xvg63#
另一个选项是使用双连接到同一个表以获取退出记录:
此处演示
rjjhvcjd4#
这是原始查询的简化版本:
看小提琴
但不管你怎么写,它总是一种非等联接(即不是基于
=
)如果没有匹配的索引,性能可能会很差。顺便说一句,如果这是mariadb或mysql 8,那么对于lag/lead来说是一个简单的任务。
ejk8hzay5#
试试这个:只需对每个条目的数据进行排名
employee, ac_date, ac_time
在单独的集合中退出,然后加入,这是您可以使用的一种简单方法INNER JOIN
而不是LEFT JOIN
为了更好的性能,如果你想要的记录与入口和出口outputhttp://sqlfiddle.com/#!2018年9月891日