[英]Checking services logs for “working time” users — conditions in having clause
我有一个按用户ID进行的服务使用情况表,并附有一个维度表,其中包括日期,星期几,一天中的小时等等。每次用户使用该服务时,都会创建一个新行来记录时间采用。
我想查找在五个工作日中至少有四个使用该服务的用户,每天至少在一天的8个小时内记录使用情况。 这些是“工作时间”用户。 我怎样才能最好地做到这一点?
目前,我正在损害下面的having
子句,该子句不能完全捕获上面指定的条件。 相反,它可以使用户每月至少使用16个工作日, 每天平均使用至少8个小时。
select
a.userId
from SERVICE_LOGS_MTHLY a
inner join DIM_TIME_OF_DAY b
on a.TOD_ID = b.TOD_ID
having
count(distinct (case when b.day_of_week in ('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY') then a.day end)) >= 16
AND
count(distinct (case when b.day_of_week in ('MONDAY') then a.day||b.hour24 end)) >= 8*count(distinct (case when b.day_of_week in ('MONDAY') then a.day end))
AND
count(distinct (case when b.day_of_week in ('TUESDAY') then a.day||b.hour24 end)) >= 8*count(distinct (case when b.day_of_week in ('TUESDAY') then a.day end))
AND
count(distinct (case when b.day_of_week in ('WEDNESDAY') then a.day||b.hour24 end)) >= 8*count(distinct (case when b.day_of_week in ('WEDNESDAY') then a.day end))
AND
count(distinct (case when b.day_of_week in ('THURSDAY') then a.day||b.hour24 end)) >= 8*count(distinct (case when b.day_of_week in ('THURSDAY') then a.day end))
AND
count(distinct (case when b.day_of_week in ('FRIDAY') then a.day||b.hour24 end)) >= 8*count(distinct (case when b.day_of_week in ('FRIDAY') then a.day end))
这涉及到聚合,即涉及两个步骤。 一种是提供用户每天记录服务多少小时,另一种是提供每周工作日的数量。
使用一个名为Hourly的简单表,该表似乎与表的描述最少匹配,请参阅我的SQL Fiddle方案。
第一步是每天汇总小时数。
select h.ID, h.StartDate, count(*) as DailyCount
from Hourly h
where DoW in( 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' )
group by h.ID, h.StartDate;
您不太清楚,因此无论用户在一小时内执行了一次可记录事件,该假设一个条目使用一个小时。 必要时进行调整。
现在,只需将每个星期加起来等于8天或更长时间即可。 这将使用上面查询的结果,因此,如果没有可用的CTE,则将其放入CTE或从中创建视图(MySQL)。
with
Daily( ID, StartDate, DailyCount )as(
select h.ID, h.StartDate, count(*) as DailyCount
from Hourly h
where DoW in( 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' )
group by h.ID, h.StartDate
)
select d.ID, Sum( case when DailyCount < 8 then 0 else 1 end ) as WeeklyCount
from Daily d
group by d.ID, To_Char( d.StartDate, 'iw' );
现在,您只需为每个用户每周检查4个或更多的WeeklyCount。
注意: To_Char
允许您按周分组。 对于Oracle以外的大多数DBMS,这是由DatePart
函数提供的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.