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