我有一个包含员工的工作转移数据的表。每一行都包含员工ID编号,不管它们或缩小计时和相应的行动日期时间。表shifts
:
+-----+------------+--------+---------------------+
| id | employeeid | action | timestamp |
+-----+------------+--------+---------------------+
| 99 | 76 | in | 2019-01-25 12:20:43 |
| 100 | 76 | out | 2019-01-25 22:17:22 |
| 102 | 76 | in | 2019-01-26 10:38:14 |
| 104 | 76 | out | 2019-01-26 17:00:26 |
| 105 | 76 | in | 2019-01-27 11:45:35 |
| 106 | 76 | out | 2019-01-27 14:48:27 |
| 110 | 76 | in | 2019-01-27 17:33:15 |
| 117 | 76 | out | 2019-01-28 02:16:21 |
+-----+------------+--------+---------------------+
我需要创建每个轮班表示为单行,像这样一个观点:
action
如果员工的最后一个动作是in
那么出应为NULL
我已经通过,从行合并的数据列,但找不到任何与这样的二进制情况涉及几个帖子读。
有人能指出我在这个正确的方向?谢谢。
以前的答案看起来不错,但我在一天,或跨越多天的转变想知道两班倒,心想也许ID是很重要的。
我假设id列是一个始终保持上升的整数主键。
我认为没有人可以检查出没有首先检查。
我想,你希望如果有人在已检查但没有走出“走出去”为NULL。
我以为时间戳记不是保留字,表名=转变。
尝试:
out
没有相关子查询解决方案...
+------------+---------------------+---------------------+
| employeeid | in | out |
+------------+---------------------+---------------------+
| 76 | 2019-01-25 12:20:43 | 2019-01-25 22:17:22 |
| 76 | 2019-01-26 10:38:14 | 2019-01-26 17:00:26 |
| 76 | 2019-01-27 11:45:35 | 2019-01-27 14:48:27 |
| 76 | 2019-01-27 17:33:15 | 2019-01-28 02:16:21 |
+------------+---------------------+---------------------+
你可以组由employeid和日期的数据,并在第一时间拿到并持续了日期时间用分钟与嵌套如果max函数。
in
编辑:
正如我现在知道,想要的解决方案是,该查询返回一行每个序列的员工是在办公室里。因此,如果员工是在办公室从早上8点至12点,在13:00再次回来,并在22:00再次离开,应该有2行。我有一个窗口的功能解决了这个问题,你至少需要MySQL版本8.如果您还没有MySQL版本8,你可以用一个自连接解决它。
SELECT employeeid,
timestamp AS "in",
(SELECT MIN(s3.timestamp) FROM shifts s3
WHERE s3.employeeid = s1.employeeid
AND s3.action='out' AND s3.id > s1.id) AS "out"
FROM shifts s1 WHERE action='in';