我必须为员工安排时间计时。每个员工都会被一张票证识别,当票证到达并离开大楼时会被扫描。不幸的是,我不能确定他们是否因为法律而到达或离开(他们在地下工作)。
我正在考虑将两行分组到一个以获得工作时间。如果在到达或离开时两次扫描票证,则出现我使用此方法的唯一问题。
你会如何解决这个问题?
答案 0 :(得分:0)
如果我要执行这样的任务,我会使用清理技术。
我会查看最近的数据(让我们说昨天' s)并删除(或标记useless
)所有可疑行。之后我可以使用一个简单的JOIN
来阅读"到达" "离开"行为一:
SELECT *
FROM TicketUsages arriving
JOIN TicketUsages leaving
ON arriving.ticket_id = leaving.ticket_id
AND arriving.created_at < leaving.created_at
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
/** Optional: AND NOT arriving.useless AND NOT leaving.useless **/
清理程序只需要找到不同数量的票据然后2.这将显示无效票证:
SELECT ticket_id, count(*)
FROM TicketUsages
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
GROUP BY ticket_id
HAVING count(*) != 2
然后你只需要决定如何处理这些行。如果有超过2,你可能只保留第一个和最后一个。但是,如果只返回1行,那么由您决定该做什么。