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 21489 게시물 읽기
No. 21489
쿼리문 다시 물어볼께요..
작성자
궁금이
작성일
2005-01-20 10:55
조회수
2,157

아래에서 물어봤는데..제가 내용을 정확하게 못 물어봐서

다시 물어볼께요..

 

한대의 차에 물건을 넣을때의 데이타 입니다..

한대에 한번에 물건을 넣을수도 있지만 2-3번에 나누어서 물건을 넣을수도 있습니다..

예)

차번호 시간 물량

1111 2005-01-19 09:50 3

1111 2005-01-19 09:52 3

2222 2005-01-19 09:58 2

2222 2005-01-19 10:00 2

2222 2005-01-19 10:02 2

1111 2005-01-19 11:30 3

1111 2005-01-19 11:32 3

이런 데이타를 차번호로 그룹을 만들어서 차별 마지막 시간과 합친물량을 구할려고 합니다..

차번호 시간 물량

1111 2005-01-19 09:52 6

2222 2005-01-19 10:02 6

1111 2005-01-19 11:32 6

이렇게 데이타가 가능한지요??

중간에 시간이 바뀔수 있어서 좀 애매하더라고요...ㅠㅠ

 

select 차, max(시간), sum(물량) 이렇게 하면 데이타가 좀 이상하게 나오고요

2222 2005-01-19 09:58 2

2222 2005-01-19 10:00 2

2222 2005-01-19 10:02 2

2222 2005-01-19 17:00 3

2222 2005-01-19 17:02 3

가령 이 위의 데이타를 합쳐서

2222 2005-01-19 10:02 6

2222 2005-01-19 17:02 6

이렇게 나오고 싶은데...

이넘의 2222 의 차가 오후에 또 물건을 실을수가 있어서요

시간이 10분안에 들어오는 차를 그룹을 할수는 없을까요?

 

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

질문하시는 의도는 이해가 됩니다만.... 보충을 위해서 다시 문의를 드리겠습니다.

 

1. 출고시간을 시간단위로 배분해도 되는지?

11시, 12시와 같이 시간단위로 배분해도 된다면 쉽게 해결이 되겠습니다만, 이경우에는 10분 간격을 하나로 묶을 수 없다는 문제가 생길수도 있습니다. 즉, 11시 59분에 출고된 것과 12:01분에 출고된 것을 그룹화 할 수 가 없다는 문제가 있지요.

 

2. 한 차량에 동시에 출고되는 건수가 제한적으로 존재하는지?

10분을 제한시간으로 할때 몇건이나 동일차량에 출고될 수 있는 것이지에 따라서 직전 출고분과의 시간차를 산출해서 그룹핑할수 있겠습니다만(LAG 사용), 이것도 건수의 제한이 없다면 문제가 있지요.

 

문제를 해결하시는 방법에 있어서, 오히려 현재 자료의 활용에만 시선을 집중시킬 것이 아니라, 현행 업무방법의 개선이 필요하지 않을까 생각이 됩니다. 아예 출고시에 그룹핑할 대상에 대해서 일련번호와 같은 UNIQUE KEY를 부여하는 것이 맞는 것으로 생각이 됩니다.(업무를 대한 몰이해때문인지도 모르겠습니다만...)

지나가며님이 2005-01-20 11:50에 작성한 댓글입니다. Edit

1.  출고시간을 시간단위로 배분하는 건 힘들겠고요

 

2. 한 차량에 1건 내지는 3건정도 데이타가 발생을 합니다.

   그리고 1시간 이내에는 데이타 발생이 하지 않습니다..

    LAG를 이용해도 시간, 분까지 같아야 하는거 아닌가요?

    제가 LAG를 한번도 사용하지 않아서요..ㅠㅠ

 

저희가 이 데이타를 발생하는게 아니고..업체에서

이 데이타를 받기 때문에 업무적으로 바꾸는건 너무 힘이

드네요...

 

 

 

궁금이님이 2005-01-20 15:39에 작성한 댓글입니다. Edit

임시테이블을 사용하지 않고, 작업을 수행하도록 구성하다보니, 인라인뷰가 너무 많이 사용되는 느낌입니다.
아직 수준이 일천한지라 이정도에서 만족해주시길....

(창이 작아서 보시기에 불편하실겁니다. 그대로 복사하셔서 일반에티터에서 확인하시길....)

 

◆ 샘플테이블 생성

CREATE  TABLE CARGO
(
    CARNO       VARCHAR2(10),
    CDATE       DATE,
    CUNIT       NUMBER
)

 

◆ 샘플데이터 로드

INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 09:50','YYYY-MM-DD HH24-MI'), 1);
INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 09:52','YYYY-MM-DD HH24-MI'), 3);
INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 09:57','YYYY-MM-DD HH24-MI'), 2);
INSERT INTO CARGO VALUES ('3333',TO_DATE('2005-01-19 09:57','YYYY-MM-DD HH24-MI'), 5);
INSERT INTO CARGO VALUES ('2222',TO_DATE('2005-01-19 09:58','YYYY-MM-DD HH24-MI'), 1);
INSERT INTO CARGO VALUES ('2222',TO_DATE('2005-01-19 10:00','YYYY-MM-DD HH24-MI'), 4);
INSERT INTO CARGO VALUES ('2222',TO_DATE('2005-01-19 10:02','YYYY-MM-DD HH24-MI'), 7);
INSERT INTO CARGO VALUES ('4444',TO_DATE('2005-01-19 11:30','YYYY-MM-DD HH24-MI'), 2);
INSERT INTO CARGO VALUES ('4444',TO_DATE('2005-01-19 11:32','YYYY-MM-DD HH24-MI'), 3);
INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 11:30','YYYY-MM-DD HH24-MI'), 8);
INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 11:32','YYYY-MM-DD HH24-MI'), 2);
INSERT INTO CARGO VALUES ('1111',TO_DATE('2005-01-19 11:35','YYYY-MM-DD HH24-MI'), 3);

 

◆ 작업시퀄

SELECT  MIN(CARNO), MAX(CDATE), SUM(CUNIT)
FROM  (
        SELECT  RNUM, CARNO, CDATE, CUNIT, B_RNUM, B_CARNO, B_CDATE, TERM, GRPID, B_GRPID,
                CASE WHEN CARNO = B_CARNO AND (CDATE - B_CDATE) * 24 * 60 < 10 THEN B_GRPID
                                                                             ELSE GRPID      END L_GRPID 
        FROM  (
                SELECT  RNUM, CARNO, CDATE, CUNIT, B_RNUM, B_CARNO, B_CDATE, TERM, GRPID, LAG(GRPID) OVER(ORDER BY RNUM) B_GRPID
                FROM  (
                        SELECT  RNUM, CARNO, CDATE, CUNIT, B_RNUM, B_CARNO, B_CDATE, (CDATE - B_CDATE) * 24 * 60 TERM,
                                CASE WHEN CARNO = B_CARNO AND (CDATE - B_CDATE) * 24 * 60 < 10  THEN B_RNUM
                                                                                                ELSE RNUM    END GRPID 
                        FROM  (
                                SELECT  RNUM, CARNO, CDATE, CUNIT, LAG(RNUM) OVER(ORDER BY RNUM) B_RNUM, LAG(CARNO) OVER(ORDER BY RNUM) B_CARNO, LAG(CDATE) OVER(ORDER BY RNUM) B_CDATE
                                FROM  (
                                        SELECT  ROW_NUMBER() OVER(ORDER BY CARNO,CDATE) RNUM, CARNO, CDATE, CUNIT
                                        FROM    CARGO
                                      )
                              )
                      )
              )  
      )
GROUP BY L_GRPID           


◆ 작업결과

CARNO   CDATE                       CUNIT                          
=========================================
1111    2005-01-19 오전 9:57:00     6                          
1111    2005-01-19 오전 11:35:00    13                         
2222    2005-01-19 오전 10:02:00    12                         
3333    2005-01-19 오전 9:57:00     5                          
4444    2005-01-19 오전 11:32:00    5                          


◆ 인라인뷰 단계별 결과(작업시퀄의 내부단위부터 실행한 결과입니다)

1'ST    ROW_NUMBER()을 이용하여 차량번호와 출고일시순서로 일련번호를 부여합니다.(입력된 순서로 하기에는 자료의 정합성이 우려가 되므로...)

  RNUM    CARNO   CDATE                       CUNIT                          
  =================================================
        1       1111    2005-01-19 오전 9:50:00     1                          
        2       1111    2005-01-19 오전 9:52:00     3                          
        3       1111    2005-01-19 오전 9:57:00     2                          
        4       1111    2005-01-19 오전 11:30:00    8                          
        5       1111    2005-01-19 오전 11:32:00    2                          
        6       1111    2005-01-19 오전 11:35:00    3                          
        7       2222    2005-01-19 오전 9:58:00     1                          
        8       2222    2005-01-19 오전 10:00:00    4                          
        9       2222    2005-01-19 오전 10:02:00    7                          
        10      3333    2005-01-19 오전 9:57:00     5                          
        11      4444    2005-01-19 오전 11:30:00    2                          
        12      4444    2005-01-19 오전 11:32:00    3                          

                                           
2'ND    LAG()를 이용하여, 직전 ROW의 차량번호, 출고일시를 확인합니다.(B_~가 직전ROW의 값입니다)

  RNUM    CARNO   CDATE                       CUNIT   B_RNUM  B_CARNO B_CDATE            
  ===========================================================================================
        1       1111    2005-01-19 오전 9:50:00     1                          
        2       1111    2005-01-19 오전 9:52:00     3       1       1111    2005-01-19 오전 9:50:00            
        3       1111    2005-01-19 오전 9:57:00     2       2       1111    2005-01-19 오전 9:52:00            
        4       1111    2005-01-19 오전 11:30:00    8       3       1111    2005-01-19 오전 9:57:00            
        5       1111    2005-01-19 오전 11:32:00    2       4       1111    2005-01-19 오전 11:30:00               
        6       1111    2005-01-19 오전 11:35:00    3       5       1111    2005-01-19 오전 11:32:00               
        7       2222    2005-01-19 오전 9:58:00     1       6       1111    2005-01-19 오전 11:35:00               
        8       2222    2005-01-19 오전 10:00:00    4       7       2222    2005-01-19 오전 9:58:00            
        9       2222    2005-01-19 오전 10:02:00    7       8       2222    2005-01-19 오전 10:00:00               
        10      3333    2005-01-19 오전 9:57:00     5       9       2222    2005-01-19 오전 10:02:00               
        11      4444    2005-01-19 오전 11:30:00    2       10      3333    2005-01-19 오전 9:57:00            
        12      4444    2005-01-19 오전 11:32:00    3       11      4444    2005-01-19 오전 11:30:00               

                                           
3'RD    직전ROW의 값과 비교하여, 차량번호가 같고, 시간차이가 10분이내인 건을 동일그룹으로 설정합니다.
        이때 시간차이가 10분이내인 것은 (CDATE - B_CDATE) * 24 * 60 < 10 에서 처리되며, 만일 시간배정을 바꾸실 경우에는 이 값을 조정하시면 됩니다.
        동일그룹으로 설정한다는 것은 직전ROW의 RNUM을 부여하는 것을 의미합니다.

  RNUM    CARNO   CDATE                       CUNIT   B_RNUM  B_CARNO B_CDATE                     TERM    GRPID      
  =============================================================================================================
        1       1111    2005-01-19 오전 9:50:00     1                                                           1      
        2       1111    2005-01-19 오전 9:52:00     3       1       1111    2005-01-19 오전 9:50:00     2       1      
        3       1111    2005-01-19 오전 9:57:00     2       2       1111    2005-01-19 오전 9:52:00     5       2      
        4       1111    2005-01-19 오전 11:30:00    8       3       1111    2005-01-19 오전 9:57:00     93      4      
        5       1111    2005-01-19 오전 11:32:00    2       4       1111    2005-01-19 오전 11:30:00    2       4      
        6       1111    2005-01-19 오전 11:35:00    3       5       1111    2005-01-19 오전 11:32:00    3       5      
        7       2222    2005-01-19 오전 9:58:00     1       6       1111    2005-01-19 오전 11:35:00    -97     7      
        8       2222    2005-01-19 오전 10:00:00    4       7       2222    2005-01-19 오전 9:58:00     2       7      
        9       2222    2005-01-19 오전 10:02:00    7       8       2222    2005-01-19 오전 10:00:00    2       8      
        10      3333    2005-01-19 오전 9:57:00     5       9       2222    2005-01-19 오전 10:02:00    -5      10     
        11      4444    2005-01-19 오전 11:30:00    2       10      3333    2005-01-19 오전 9:57:00     93      11     
        12      4444    2005-01-19 오전 11:32:00    3       11      4444    2005-01-19 오전 11:30:00    2       11     

                                           
4'TH    동일차량에 대한 출고가 3건까지 가능하다고 하셨으면 (2)~(3)의 작업을 한번 더 수행합니다. 다만, 이때는 RNUM 대신에
        그룹아이디(GRPID)에 대하여 LAG()를 적용합니다.

  RNUM    CARNO   CDATE                       CUNIT   B_RNUM  B_CARNO B_CDATE                     TERM    GRPID   B_GRPID
  =======================================================================================================================
        1       1111    2005-01-19 오전 9:50:00     1                                                           1      
        2       1111    2005-01-19 오전 9:52:00     3       1       1111    2005-01-19 오전 9:50:00     2       1       1  
        3       1111    2005-01-19 오전 9:57:00     2       2       1111    2005-01-19 오전 9:52:00     5       2       1  
        4       1111    2005-01-19 오전 11:30:00    8       3       1111    2005-01-19 오전 9:57:00     93      4       2  
        5       1111    2005-01-19 오전 11:32:00    2       4       1111    2005-01-19 오전 11:30:00    2       4       4  
        6       1111    2005-01-19 오전 11:35:00    3       5       1111    2005-01-19 오전 11:32:00    3       5       4  
        7       2222    2005-01-19 오전 9:58:00     1       6       1111    2005-01-19 오전 11:35:00    -97     7       5  
        8       2222    2005-01-19 오전 10:00:00    4       7       2222    2005-01-19 오전 9:58:00     2       7       7  
        9       2222    2005-01-19 오전 10:02:00    7       8       2222    2005-01-19 오전 10:00:00    2       8       7  
        10      3333    2005-01-19 오전 9:57:00     5       9       2222    2005-01-19 오전 10:02:00    -5      10      8  
        11      4444    2005-01-19 오전 11:30:00    2       10      3333    2005-01-19 오전 9:57:00     93      11      10 
        12      4444    2005-01-19 오전 11:32:00    3       11      4444    2005-01-19 오전 11:30:00    2       11      11 


5'TH    최종적으로 L_GRPID 가 설정됩니다. 결과적으로 동일차량에 대한 출고간격이 10분이내인 건을 동일 그룹으로 설정하게 됩니다.

  RNUM    CARNO   CDATE                       CUNIT   B_RNUM  B_CARNO B_CDATE                     TERM    GRPID   B_GRPID L_GRPID
  ===============================================================================================================================
        1       1111    2005-01-19 오전 9:50:00     1                                                           1               1
        2       1111    2005-01-19 오전 9:52:00     3       1       1111    2005-01-19 오전 9:50:00     2       1       1       1
        3       1111    2005-01-19 오전 9:57:00     2       2       1111    2005-01-19 오전 9:52:00     5       2       1       1
        4       1111    2005-01-19 오전 11:30:00    8       3       1111    2005-01-19 오전 9:57:00     93      4       2       4
        5       1111    2005-01-19 오전 11:32:00    2       4       1111    2005-01-19 오전 11:30:00    2       4       4       4
        6       1111    2005-01-19 오전 11:35:00    3       5       1111    2005-01-19 오전 11:32:00    3       5       4       4
        7       2222    2005-01-19 오전 9:58:00     1       6       1111    2005-01-19 오전 11:35:00    -97     7       5       7
        8       2222    2005-01-19 오전 10:00:00    4       7       2222    2005-01-19 오전 9:58:00     2       7       7       7
        9       2222    2005-01-19 오전 10:02:00    7       8       2222    2005-01-19 오전 10:00:00    2       8       7       7
        10      3333    2005-01-19 오전 9:57:00     5       9       2222    2005-01-19 오전 10:02:00    -5      10      8       10
        11      4444    2005-01-19 오전 11:30:00    2       10      3333    2005-01-19 오전 9:57:00     93      11      10      11
        12      4444    2005-01-19 오전 11:32:00    3       11      4444    2005-01-19 오전 11:30:00    2       11      11      11

 

LAST    최종그룹아이디(L_GRPID)를 적용하여 GROUP BY를 수행합니다.

  CARNO   CDATE                       CUNIT                          
        =========================================
        1111    2005-01-19 오전 9:57:00     6                          
        1111    2005-01-19 오전 11:35:00    13                         
        2222    2005-01-19 오전 10:02:00    12                         
        3333    2005-01-19 오전 9:57:00     5                          
        4444    2005-01-19 오전 11:32:00    5                          

 

지니가며님이 2005-01-21 10:05에 작성한 댓글입니다. Edit

흠... 결과값이 제대로 안나오는걸 올렸네여..

지웠어여.. 송구..

아르..님이 2005-01-21 14:42에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
21493TO_NUMBER [1]
권선훈
2005-01-20
2492
21491한글이 깨져요... 오라클 9i에서요...
궁금이...
2005-01-20
1424
21490문자필드에서 특정문자를 포함하는 단어전체를 추출할려면어떻게? [2]
김현호
2005-01-20
2335
21489쿼리문 다시 물어볼께요.. [4]
궁금이
2005-01-20
2157
21488Dynamic Sql 도움구합니다. [1]
머찌니
2005-01-20
2221
21487Oracle의 SID, Service Name, Instance 정확한 개념을 알고 싶습니다.
용훈
2005-01-20
1350
21486[질문] 오라클에서 프로세스가 어떤게 돌고 있는지 확인하는 방법이 있나요?
정규성
2005-01-20
1059
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다