如何跟踪仓库员工扫描的 5 分钟间隔?

Posted

技术标签:

【中文标题】如何跟踪仓库员工扫描的 5 分钟间隔?【英文标题】:How to track 5 minute gaps in scans for warehouse employees? 【发布时间】:2019-09-25 14:56:11 【问题描述】:

我希望创建一个查询来计算员工在 5 分钟内处于非活动状态的次数。现在,我想到了一个 CASE 语句,它将他们的扫描分解为 12 段(不要介意转换——我们必须将所有需要更改为 4 小时后,因为服务器位于另一个时区(它糟透了)

case 
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '0' and '4' then 0
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '5' and '9' then 1
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '10' and '14' then 2
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '15' and '19' then 3
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '20' and '24' then 4
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '25' and '29' then 5
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '30' and '34' then 6
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '35' and '39' then 7
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '40' and '44' then 8
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '45' and '49' then 9
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '50' and '54' then 10
    when DATEPART(minute, CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, th1.ACTIVITY_DATE_TIME), DATENAME(TzOffset, SYSDATETIMEOFFSET())))) between '55' and '59' then 11
    END)) 

然后,我将 0-11 的不同数量的数字从 12 中减去。我知道这不是一个完美的系统,因为如果有人在 7:01 进行扫描,而在 7:09 进行下一次扫描,则不会标记 5 分钟的间隔。

有没有人知道更好的方法来跟踪交易历史中的空白?

【问题讨论】:

使用LAG 以按员工划分的分析形式计算上一次扫描的准确间隔。 如果代码必须经过数十万行,这将如何执行?一旦我有了确切的间隔,我是否必须使用 COUNT(CASE 语句来计算在给定小时内超过 5 分钟的间隔有多少? OUI,这种方法需要排序(具体来说是窗口排序)。 @MarmiteBomber 这非常有用!将报告时间从 5 分钟缩短到 3 秒(我的旧逻辑需要 3 个左转右) 【参考方案1】:

LAG analytic function 来救你了。

这里是使用这个示例数据的简单演示

create table emp_pause 
(emp_no int,
 work_time date);

insert into emp_pause values(1, to_date('01012019 0810','ddmmyyyy hh24mi'));
insert into emp_pause values(1, to_date('01012019 0812','ddmmyyyy hh24mi'));
insert into emp_pause values(1, to_date('01012019 0817','ddmmyyyy hh24mi'));
insert into emp_pause values(1, to_date('01012019 0818','ddmmyyyy hh24mi'));
insert into emp_pause values(1, to_date('01012019 0830','ddmmyyyy hh24mi'));
insert into emp_pause values(2, to_date('01012019 1000','ddmmyyyy hh24mi'));
insert into emp_pause values(2, to_date('01012019 1004','ddmmyyyy hh24mi'));
insert into emp_pause values(2, to_date('01012019 1012','ddmmyyyy hh24mi'));
insert into emp_pause values(2, to_date('01012019 1029','ddmmyyyy hh24mi'));
insert into emp_pause values(2, to_date('01012019 1030','ddmmyyyy hh24mi'));
commit;

此查询计算当前时间戳与同一员工上一行的值的差异(以分钟为单位)。

select emp_no, work_time,
trunc((work_time - lag(work_time) over (partition by emp_no order by work_time)) *24*60) interval_minutes
from emp_pause order by emp_no, work_time;

    EMP_NO WORK_TIME           INTERVAL_MINUTES
---------- ------------------- ----------------
         1 01.01.2019 08:10:00                  
         1 01.01.2019 08:12:00                2 
         1 01.01.2019 08:17:00                5 
         1 01.01.2019 08:18:00                1 
         1 01.01.2019 08:30:00               12 
         2 01.01.2019 10:00:00                  
         2 01.01.2019 10:04:00                4 
         2 01.01.2019 10:12:00                8 
         2 01.01.2019 10:29:00               17 
         2 01.01.2019 10:30:00                1 

只保留过滤比请求的 5 分钟长的时间间隔:

with emp as (
select emp_no, work_time,
trunc((work_time - lag(work_time) over (partition by emp_no order by work_time)) *24*60) interval_minutes
from emp_pause)
select * from emp 
where interval_minutes >= 5
order by 1,2;

    EMP_NO WORK_TIME           INTERVAL_MINUTES
---------- ------------------- ----------------
         1 01.01.2019 08:17:00                5 
         1 01.01.2019 08:30:00               12 
         2 01.01.2019 10:12:00                8 
         2 01.01.2019 10:29:00               17

【讨论】:

以上是关于如何跟踪仓库员工扫描的 5 分钟间隔?的主要内容,如果未能解决你的问题,请参考以下文章

员工维度在数据仓库中每天被截断

5分钟知道git如何使用?(git入门常用命令)

5分钟轻松教你学会:Docker镜像仓库的使用

5分钟读懂数据仓库四种存储策略!

数据仓库基础知识,「5分钟+8角度」帮你搞定!

从8个角度5分钟搞定数据仓库