2014-12-26 3 views
0

날짜, 요일, 시간 등을 포함하는 차원 테이블과 함께 제공되는 사용자 ID 별 서비스 테이블 사용이 있습니다. 사용자가 서비스를 사용할 때마다 사용 시간을 기록하는 새로운 행이 만들어집니다."작업 시간"사용자에 대한 서비스 로그 검사 - 조항이있는 조건

서비스를 사용하는 사용자가 주중 5 명 중 4 명 이상, 매일 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)) 

답변

0

여기에는 집계가 포함됩니다. 즉, 두 단계가 포함됩니다. 하나는 매일 사용자가 서비스를 기록하는 시간을 제공하고 다른 하나는 매주 평일의 수를 제공하는 것입니다.

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; 

너무 명확하지 않으므로 사용자가 loggable 이벤트를 몇 시간 씩 수행했는지에 관계없이 1 시간 씩 사용할 수 있습니다. 필요한 경우 조정하십시오.

이제 각 주에 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'); 

이제 매주 각 사용자에 대해 WeeklyCount가 4 이상인지 확인하십시오.

참고 : To_Char을 사용하면 일주일 단위로 그룹화 할 수 있습니다. 오라클 이외의 대부분의 DBMS의 경우 이것은 DatePart 함수에 의해 제공됩니다.