2016-08-24 3 views
0

내가 시도하는 것은 앞으로 6 개월 동안 하루에받을 수있는 최대 작업 수를 찾는 것입니다. 열려있는 작업의 최대 수 찾기

task 1 runs 1-jan-16 and ends 10-jan-16 
Task 2 runs 3-Jan-16 and ends 15-jan-16 
task 3 runs 6-Jan-16 and ends 10-Jan-16 
Task 4 runs 9-Jan-16 and ends 20-Jan-16 

예를

에 대한

그래서이 예에서는 그래서 결과가이 시나리오에서 4되고 싶어 1 월 일과 10 월 사이에 열려있는 4 개 작업이 있습니다. 그 이유는 내가 그들을 Gantt 차트에 표시하고 있기 때문에 그들은 모두 서로 아래에있게 될 것입니다.

내가 지금까지 작업해야하는 것은입니다 :

select schedule_start_date,am.AC,count(wo) as from ac_master am 
left outer join wo on wo.ac = am.ac and ac_type = '190' 
where wo.status = 'OPEN' 
group by am.ac,schedule_start_date 

이는 하루에 수 있지만, 이들 중 일부는 겹칠 수를 표시합니다.

어쨌든 제가 성취하려는 일을하고 있습니까?

+1

출력에 실제로 사용하려는 날짜 그룹화는 무엇입니까? –

+0

이상적으로 나는 am.ac을 좋아하고 얼마나 많은 작업이 열려 있는지에 대한 그림을 원합니다. 한 번에 열려있는 작업의 최대 개수를보고 싶다는 등의 날짜 범위 등을 실제로 볼 필요는 없습니다. –

+0

'schedule_end_date'라는 열이 있습니까? –

답변

1

당신은 단지 특정 시점에서 예약 된 각 그룹의 수를 원한다면, 당신은 단지 시작과 끝 날짜와 BETWEEN를 사용할 수 있습니다

에 관계없이 행 집합을 개발하는 방법
SELECT schedule_start_date, 
     am.AC, 
     COUNT(*) AS theCount 
FROM ac_master am 
LEFT OUTER JOIN wo 
    ON wo.ac = am.ac AND 
     ac_type = '190' 
WHERE wo.status = 'OPEN' AND 
     '2016-01-10' BETWEEN schedule_start_date AND schedule_end_date 
GROUP BY schedule_start_date, 
     am.ac 
+1

완벽한 감사 Tim을 만든다! :) 좋은 하루 되세요! –

1

start_dateend_date 인 경우 다음은 작업 수가 시간에 따라 어떻게 변하는 지 보여주는 방법입니다. 각 날짜는 작업 수를 이전 값에서 새 값으로 변경 한 첫 번째 날짜입니다.

max(tasks) 만 있으면 필요한만큼 그룹화 할 수 있습니다. (또는 오라클 12에서는 tasks으로 주문할 수 있고 새로운 fetch first 기능을 사용할 수 있습니다. partition by 절에도 유의하십시오. - 다른 카테고리 (예 : 다른 "부서"등)에 대해 다른 그룹이 필요한 경우이 항목을 사용할 수 있습니다 절을 사용하여 계산이 각 그룹에 대해 개별적으로 수행되며 모두 데이터를 한 번에 통과합니다.

with 
    intervals (start_date, end_date) as (
     select date '2016-01-01', date '2016-01-10' from dual union all 
     select date '2016-01-03', date '2016-01-15' from dual union all 
     select date '2016-01-06', date '2016-01-10' from dual union all 
     select date '2016-01-09', date '2016-01-20' from dual 
    ), 
    u (dt, flag) as (
     select start_date , 1 from intervals 
     union all 
     select end_date + 1, -1 from intervals 
    ) 
select distinct dt, sum(flag) over (partition by null order by dt) as tasks 
from u 
order by dt; 


DT    TASKS 
---------- --------- 
2016-01-01   1 
2016-01-03   2 
2016-01-06   3 
2016-01-09   4 
2016-01-11   2 
2016-01-16   1 
2016-01-21   0 
관련 문제