繁体   English   中英

检查“工作时间”用户的服务日志-Have子句中的条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM