簡體   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