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 41227 게시물 읽기
No. 41227
로그성 데이터 쿼리 문의 드립니다.
작성자
쿼리OTL
작성일
2016-08-29 22:03
조회수
6,958

로그성 데이터 패턴 뽑는데 LAG,LEAD 함수를 이용해 뽑아 보는데 쉽지 않네요.

 

중간값은 무시하고 순서기준 특정 코드 순서가 1건이라도 나오는 대상을 해당 패턴으로 보고

 

수량을 집계해 보려고 합니다.

 

로그성 데이터라 수량이 많습니다.

 

 

어려울 때마다 여기서 도움 얻는데 감사합니다.

 

특히 마농님 자주 도움 주셔서 감사합니다.

 

 

원하는 패턴1 : AA->BB->CC->EE

원하는 패턴2 : HH->JJ->LL

 

조건1 : 패턴 순서 역으로 가는 경우 OK

조건2 : 한번 할당한 대상은 중복 할당 X

조건3 : 패턴 할당 우선 순위 : 1->2

조건4 : 시간 기준 중복 존재

 

 

WITH t AS

(

SELECT 'A' 이름, 'AA' EVENT_LOG, '201608121212' 일시 FROM dual UNION ALL -- 패턴1

SELECT 'A' 이름, 'BB' EVENT_LOG, '201608121212' 일시 FROM dual UNION ALL -- 패턴1

SELECT 'A' 이름, 'CC' EVENT_LOG, '201608121215' 일시 FROM dual UNION ALL -- 패턴1

SELECT 'A' 이름, 'DD' EVENT_LOG, '201608121217' 일시 FROM dual UNION ALL -- 패턴1

SELECT 'A' 이름, 'EE' EVENT_LOG, '201608121219' 일시 FROM dual UNION ALL -- 패턴1

SELECT 'A' 이름, 'FF' EVENT_LOG, '201608121221' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'EE' EVENT_LOG, '201608121223' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'GG' EVENT_LOG, '201608121225' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'BB' EVENT_LOG, '201608121227' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'HH' EVENT_LOG, '201608121228' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'LL' EVENT_LOG, '201608121230' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'JJ' EVENT_LOG, '201608121232' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'JJ' EVENT_LOG, '201608121234' 일시 FROM dual UNION AL -- 패턴2

SELECT 'A' 이름, 'LL' EVENT_LOG, '201608121236' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'KK' EVENT_LOG, '201608121238' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'AA' EVENT_LOG, '201608121240' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'CC' EVENT_LOG, '201608121212' 일시 FROM dual UNION ALL

SELECT 'A' 이름, 'HH' EVENT_LOG, '201608121214' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'LL' EVENT_LOG, '201608121216' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'JJ' EVENT_LOG, '201608121218' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'EE' EVENT_LOG, '201608121220' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'A' 이름, 'LL' EVENT_LOG, '201608121222' 일시 FROM dual UNION ALL -- 패턴2

SELECT 'B' 이름, 'AA' EVENT_LOG, '201608121225' 일시 FROM dual UNION ALL

SELECT 'B' 이름, 'BB' EVENT_LOG, '201608121227' 일시 FROM dual UNION ALL

SELECT 'B' 이름, 'LL' EVENT_LOG, '201608121228' 일시 FROM dual UNION ALL

SELECT 'B' 이름, 'EE' EVENT_LOG, '201608121230' 일시 FROM dual

)

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

패턴과 조건이 감이 잘 안오네요. 이해하기 어렵네요.

마농(manon94)님이 2016-08-30 09:40에 작성한 댓글입니다.

 제가 너무 두서 없이 쓴것 같습니다.

사람별 log 데이터가 모수 이고

여러 특정패턴으로 끝나는 대상을 찾는 겁니다. (모든 패턴 끝은 D)

A>B>C>D 패턴이면

시작이 A이고 종료가D이고 중간에 B다음C가 포함된 전체

예) aaabcbbd, aabbccdd,abcd, abcbd

쿼리OTL님이 2016-08-30 11:25에 작성한 댓글입니다.
이 댓글은 2016-08-30 11:29에 마지막으로 수정되었습니다. Edit

패턴에 대해서는 대충 감이 옴니다.

조건1~4에 대해서는 혼란스러울 뿐이네요.

해당 유형에 대한 예시와 설명이 있어야겠죠.

시간이 중복인 경우 정렬 기준이 뭐가 되는지 등등.

마농(manon94)님이 2016-08-30 11:28에 작성한 댓글입니다.

 조건 4가지는 무시하시면 됩니다.

동일 로그 건이

여러 패턴으로 중복 분류 되는걸 방지하기 위해 적은 내용입니다.

쿼리OTL님이 2016-08-30 11:38에 작성한 댓글입니다. Edit

SELECT 이름
     , REGEXP_COUNT(
       LISTAGG(event_log, ',') WITHIN GROUP(ORDER BY 일시, event_log)
       , v_pattern) cnt   -- 3.문자열 연결 후 패턴 검색
  FROM (SELECT 이름, 일시, event_log
             , v_pattern
             , LAG(event_log) OVER(
               PARTITION BY 이름 ORDER BY 일시, event_log) event_log_lag
          FROM t
             , (SELECT 'AA,BB,CC,EE' v_pattern FROM dual)
         WHERE INSTR(','||v_pattern||',', ','||event_log||',') > 0  -- 1.패턴문자만 추출
        )
 WHERE LNNVL(event_log = event_log_lag) -- 2. 연속문자 제거
 GROUP BY 이름, v_pattern
;

마농(manon94)님이 2016-08-30 16:33에 작성한 댓글입니다.
이 댓글은 2016-09-01 14:55에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
41233oracle 프로시저 추가 질문 [2]
김용완
2016-09-07
6462
41232인덱스테이블스페이스 용량문의. [2]
김삼
2016-09-07
6434
41230oracel 프로시저 질문 [2]
김용완
2016-09-06
6507
41227로그성 데이터 쿼리 문의 드립니다. [5]
쿼리OTL
2016-08-29
6958
41226급합니다 도와주세요 마감과 당월까지의 합게 [1]
울산
2016-08-29
6702
41225간단한 날짜 쿼리 [2]
울산
2016-08-26
6761
41224이 쿼리 도움 부탁드립니다 [3]
매수신호
2016-08-26
6996
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다