我有一个大型Vertica表,用于跟踪企业范围内几乎所有用户的活动。有一个子集的用户,我想确定他们每天工作的时间。最棘手的一点是,有些用户每周工作12小时,每天工作数天。有人能提出最好的方法吗?我最初是这么想的:
select users.max_hour - users.min_hour as shift_length,
timestamp_trunc(activity_dt_tm ,'ddd')
(select username,
ceil(max(hour(activity_dt_tm))) as max_hour,
floor(min(hour(activity_dt_tm))) as min_hour
from user_activity
where timestamp_trunc(activity_dt_tm ,'ddd') = '2014/11/10'
group by username
) users我将查看该查询的结果,并查看哪些用户的轮班时间低于至少8个小时的阈值,这表明他们可能从下午开始工作到第二天。一旦我有了这个用户名列表,我就会将它们传递到第二个查询中,该查询将展望第二天,并获取活动数据行的最大时间,并将其替换为“max_time”。我不是sql专家,但我认为这可能需要一些临时表来传递数据。如果有人能为我指明正确的方向,我将不胜感激。
编辑
这里有一个,它为两个用户提供了一些阶段性数据。http://sqlfiddle.com/#!2/4ce900
User2具有正常的8-5个工作日活动.User1在晚上7点左右开始工作,直到第二天才开始工作。我希望输出看起来像这样:
UserName | Shift Start | Shift End | Hours Worked
-------------------------------------------------
User1 | 7PM | 7AM | 12
User2 | 8AM | 5PM | 9我想把所有的工作时间都归因于用户开始轮班的那天。
发布于 2014-11-11 18:58:11
您可以使用下面的SQL查找用户中断的开始、结束和持续时间。然后,您可以过滤超过阈值的中断,并使用它们来分离用户的轮班。
select t1.username, t1.end_dt_tm beforeBreak, t2.start_dt_tm afterBreak, t2.start_dt_tm - t1.end_dt_tm as diff
from user_activity t1, user_activity t2
where t1.username = t2.username and t2.start_dt_tm =
(
select min(nxt.start_dt_tm) from user_activity nxt
where nxt.username = t1.username and nxt.start_dt_tm > t1.end_dt_tm
)
;(请注意,您的小提琴对用户1有两次相同的行)
https://stackoverflow.com/questions/26856830
复制相似问题