database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39592 게시물 읽기
No. 39592
스케쥴 쿼리작성 문의
작성자
정용석(libranet)
작성일
2012-08-14 16:09ⓒ
2012-08-14 16:13ⓜ
조회수
4,775

 안녕하세요, 

스케쥴 작성중 도저히 풀리지 않아 문의 드립니다. 

로직을 간략히 설명드리면....

- 순번 : 구분을 위한 시퀀스

- 가능시간 : 작업가능한 시작 시간

- 시작시간 : 가능시간

- 종료시간 : 시작시간+수행시간

- 우선순위 : 작업가능한 순번이 여러개 있을 경우 우선순위(높은수가 우선권)

- 팀 : 팀별로 시작시간은 초기화 된다(팀별 스케쥴)

ex) t1 의 경우 가능시간이 가장이른건 1번이여서 제일먼저 스케쥴이 잡히고

     그뒤에 2, 4번의 경우가 해당되는데 2번의 우선순위가 높으므로 2번의 시작, 종료 시간이 측정된다.

     그이후 4번은 7시부터 가능하지만 2번이 끝난 시간인 8시부터 수행이 가능하므로 시작시간이 8시로 측정된다.......    이런식으로 계산해서 결과 데이터가 나오게 됩니다. 

     집합적 생각만하다 이런 순차적인 결과를 가지고 다음 줄을 계산하려니 힘드네요...

     고수님의 가르침을 부탁드립니다.

 

* 원본데이터

 

순번 가능시간 시작시간 종료시간 수행시간 우선순위
1 6 6 7 1 1 t1
2 7 7 8 2 2 t1
3 10 10 11 1 3 t1
4 7 7 9 2 4 t1
5 16 16 18 2 5 t1
6 6 6 8 2 1 t2
7 6 6 8 2 2 t2
8 9 9 10 1 4 t2
9 14 14 17 3 5 t2
10 7 7 8 1 3 t2

 

*결과 데이터

 

순번 가능시간 시작시간 종료시간 수행시간 우선순위
1 6 6 7 1 1 t1
2 7 7 8 2 2 t1
4 7 8 10 2 4 t1
3 10 10 11 1 3 t1
5 16 16 18 2 5 t1
6 6 6 8 2 1 t2
7 6 8 10 2 2 t2
10 7 10 11 1 3 t2
8 9 11 12 1 4 t2
9 14 14 17 3 5 t2

 

 

이 글에 대한 댓글이 총 3건 있습니다.

 쿼리만으로는 해결을 보지 못했고....

일단, java 단에서 처리 했습니다. ㅜㅜ

정용석(libranet)님이 2012-08-15 02:23에 작성한 댓글입니다.

이렇게 하면 안될까요..

SELECT * FROM 테이블

 ORDER BY MIN(시작시간) OVER(PARTITION BY 팀 ORDER BY 시작시간, 우선순위)

제이정보님이 2012-08-15 13:44에 작성한 댓글입니다.
이 댓글은 2012-08-15 13:53에 마지막으로 수정되었습니다. Edit

with t(seq, pt, st, et, wt, pri, team) as (
select 1, 6, 6, 7, 1, 1, 't1' from dual union all
select 2, 7, 7, 8, 2, 2, 't1' from dual union all
select 3, 10, 10, 11, 1, 3, 't1' from dual union all
select 4, 7, 7, 9, 2, 4, 't1'  from dual union all
select 5, 16, 16, 18, 2, 5, 't1'  from dual union all
select 6, 6, 6, 8, 2, 1, 't2'  from dual union all
select 7, 6, 6, 8, 2, 2, 't2'  from dual union all
select 8, 9, 9, 10, 1, 4, 't2'  from dual union all
select 9, 14, 14, 17, 3, 5, 't2'  from dual union all
select 10, 7, 7, 8, 1, 3, 't2' from dual
)
select seq, pt,
       st_first + lag(wt_sum,1,0) over (partition by team order by wt_sum) st,
       st_first + lag(wt_sum,1,0) over (partition by team order by wt_sum) + wt et,
       wt, pri, team
  from 
      (select team, seq, pt, st, wt, pri,
              min(decode(pri,1,st)) over (partition by team order by pri) st_first,
              sum(wt) over (partition by team order by team, pt, pri) wt_sum
         from t
        order by team, pt, pri)

지나다가님이 2012-08-20 15:09에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39595프로시저 전체 트랜잭션 성공시만 커밋 [2]
김선미
2012-08-14
8545
39594세로일부분만 가로로뽑기 [2]
질문
2012-08-14
5443
39593리눅스에서 오라클 디비 접속 [1]
구은호
2012-08-14
4029
39592스케쥴 쿼리작성 문의 [3]
정용석
2012-08-14
4775
39591통계성 리포트 화면 쿼리
작업
2012-08-14
4019
39590김흥수님, toad 같은 툴 만드셨나요?
박창수
2012-08-13
3821
39589업데이트 처리 시 처리 지연 문제 [3]
강가딘
2012-08-10
5735
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다