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 40728 게시물 읽기
No. 40728
oracle 분석함수 질문입니다.
작성자
트랄랄라(hyoji)
작성일
2015-03-04 13:07ⓒ
2015-03-04 13:21ⓜ
조회수
9,437

년도 | 학기 | rag(년도) | rag(학기) | rank | 연속여부 | 사원

2015 | 1 | 2015 | 2 | 1 | 1 | A

2014 | 1 | 2015 | 1 | 2 | [0] | A

2013 | 1 | 2014 | 1 | 3 | [0] | A

2012 | 2 | 2013 | 1 | 4 | 1 | A

2015 | 1 | 2015 | 2 | 1 | 1 | B

2014 | 2 | 2015 | 1 | 2 | 1 | B

2014 | 1 | 2014 | 2 | 3 | 1 | B

2013 | 2 | 2014 | 1 | 4 | 1 | B

2013 | 1 | 2013 | 2 | 5 | 1 | B

2012 | 2 | 2013 | 1 | 6 | 1 | B

2014 | 1 | 2015 | 2 | 1 | [0] | C

2013 | 2 | 2014 | 1 | 2 | 1 | C

2013 | 1 | 2013 | 2 | 3 | 1 | C

2015 | 1 | 2015 | 2 | 1 | 1 | D

2014 | 2 | 2015 | 1 | 2 | 1 | D

2013 | 2 | 2014 | 2 | 3 | [0] | D

2013 | 1 | 2013 | 2 | 4 | 1 | D

 

 

안녕하세요. DB를 공부하는 초보 입니다. 사원별 연속근무내역 통계를 짜고 있습니다.

 

rag 함수와 decode를 이용하여 해당 데이터를 조회하였으며 사원별로 근무가 연속되지 않은경우

 

네모에서 처럼 0으로 나타내었습니다. 문제는 0이후 1이 나오는 사원들이 있습니다. 그래서 사원별 sum을 할수 없습니다. ㅎ

 

사원별 첫번째0 이전에 나온 값들만 추려낼수 있는지 궁금합니다.

 

B사원처럼 0이 없으니 전부 sum하면 되는 데이터도 있고 C사원처럼 첫로우부터 0인 사원도 있습니다.

 

C사원은 이전에 연속 근무하였으나 최상위가 0이므로 연속근무가 0입니다.

 

도출하고자 하는 결과는

 

 

사원 | sum(연속여부)

A | 1

B | 6

C | 0

D | 2

 

 

이러한 형태 입니다. 사원은 4명이 아니라 150명 가량 됩니다. 사원별 데이터 건수도 각각 다르구요.

 

일부 데이터만 예시로 적은것 입니다.

 

힌트좀 주세요. 감사합니다.

 

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

연속여부 항목은 추출하신 항목인 듯 한데요?
잘못 구하신게 아닌가 싶네요...
A 의 경우 2014년 2학기가 없고 2015년 1학기, 2학기 연속이므로
연속건수는 1이 아닌 2가 나와야 맞을 듯 하구요
C 도 0이 아닌 1이 맞을 듯 하네요.
즉, B 를 제외한 모든 사원이 1씩 부족한 듯 하네요.
만약 1씩 부족하게 뽑는게 맞는거라면 B 는 6이 아닌 5가 나와야 하겠죠.

마농(manon94)님이 2015-03-04 13:54에 작성한 댓글입니다.

안녕하세요. 마농님.

연속여부항목은 추출한게 맞으며 2015년 2학기는 아직 개강하지 않아서 2015년 1학기와 비교하여 연속여부를 알기 위해 decode로 추출한 데이터 입니다.

사원별 첫 0이 나오기 전까지의 데이터를 추릴수 있는 방법이 없을까요?

감사합니다.

트랄랄라님이 2015-03-04 14:08에 작성한 댓글입니다. Edit

B 는 왜 6이죠?

A, C, D 는 하나씩 덜 카운트하고 B 만 6인 이유가...

마농(manon94)님이 2015-03-04 14:21에 작성한 댓글입니다.

년도와 학기를 보시면 B는 2012년 2학기부터 계속 강의를 해왔습니다.

2012년 2학기부터 2015년1학기까지 6학기 이므로 6이 됩니다.

 

반면 A는 2015년 1학기는 강의를 하였으나 이전 2014년 2학기에 강의를 하지 않았고 2014년 1학기에 강의를 하였으므로 연속강의가 아닙니다. 그래서 2015년 1학기만 강의한 것으로 보는것 입니다.

 

그리고 C는 2015년 1학기에 강의를 하지 않았으므로 연속강의가 0입니다.

 

2015년 1학기 기준으로 이전에 얼마동안 연속강의를 하였는가의 데이터 입니다.

트랄랄라(hyoji)님이 2015-03-04 14:28에 작성한 댓글입니다.
이 댓글은 2015-03-04 14:30에 마지막으로 수정되었습니다.

B를 다른 사람과 형평성을 맞춘다면 2012년 2학기는 연속강의가 아니어야 합니다.
2012년 1학기에 강의를 하지 않았으므로 연속강의가 아니어야 합니다.


결과가 (1,5,0,2) 또는 (2,6,1,3) 이 나와야 일관성이 있다고 생각이 되네요.
(1,6,0,2)는 B 만 다른 기준이 적용된 느낌.


또한 기준이 2015년 2학기인지? 1학기인지 모호하네요.
2015년 2학기를 배제하고 1학기가 기준이 되어야 한다면?
B 가 6이 아닌 5가 되는것이 맞겠지요.

마농(manon94)님이 2015-03-04 14:36에 작성한 댓글입니다.
이 댓글은 2015-03-04 14:41에 마지막으로 수정되었습니다.

B가 2012년 2학기에 임용되었기 때문입니다.

임용이후 연속적으로 쉬지 않고 강의한 횟수를 구하는겁니다. (단 2015년 1학기 현재 기준으로 예전으로 가며)

중간에 강의를 하지 않았으면 lag함수로 비교하여 0을 찍었습니다.

연속여부가 0이 되는 순간 이사람은 2015년 1학기 기준으로 그때까지 연속해서 강의를 한것으로 보는것 입니다.

 

C의경우 재직중이나 2014년 1학기에 강의를 했고 2015년 1학기는 강의를 하지 않았으니 연속강의가 0인것 입니다.

 

D는 2013년 1학기에 임용되었고, 2015년 1학기와 2014년 2학기를 연속으로 강의하였으니 2로 보는것 입니다. (2014년1학기에 강의를 하지 않았으니까요)

 

2015년 1학기 기준입니다. 만일 제가 2015년 1학기에 강의를 하고 있고 2014년 2학기와 2014년 1학기에 강의를 했고/// 2013년 2학기에 강의를 하지 않았다면 2015년 1학기 기준 저는 3학기 동안 연속강의를 한것 입니다.

 

감사합니다.

 

트랄랄라(hyoji)님이 2015-03-04 14:46에 작성한 댓글입니다.
이 댓글은 2015-03-04 14:56에 마지막으로 수정되었습니다.

임용 첫학기 강의를 하지 않을 수도 있겠구요
 - 강의테이블 외에 교수 테이블 조인이 필요해 보이네요.
작성하신 방법은 다음학기인 2015년2학기가 필수로 있을 때 기준이듯 보이네요.
 - a, b, c, d 모두 2015년2학기가 있네요.
 - 2015년2학기가 없는 경우도 고려해야 할 듯 하네요.

마농(manon94)님이 2015-03-04 14:56에 작성한 댓글입니다.

2015년 2학기는 제가 이전로우와 비교하여 사원이 바뀌거나 첫로우인경우 lag함수로 이전 데이터를 읽어 비교하지 않고 decode로 2015년 2학기로 강제로 넣어 비교하였습니다.

왜냐하면 2015년 1학기 기준으로 과거 언제까지 연속했나 보기 때문입니다.

트랄랄라(hyoji)님이 2015-03-04 15:04에 작성한 댓글입니다.

올려주신 가공 데이터를 보고 착각 했네요.

실제 원본 데이터를 잘못 인지 했습니다.

제가 앞 두 항목을 보지 않고 계속 뒤에 두항목을 보고 있었네요. 이런...

마농(manon94)님이 2015-03-04 15:09에 작성한 댓글입니다.

데이터에서 사원별 연속여부가 첫 0이전까지 갯수를 구한다고 보시면 됩니다.

B와 같은 경우엔 계속연속해서 연속여부에 0이 없을수도 있습니다.

관심 감사합니다. 마농님 ^^

트랄랄라(hyoji)님이 2015-03-04 15:20에 작성한 댓글입니다.

WITH t AS
(
SELECT '2015' yy, '1' hg, 'A' id FROM dual
UNION ALL SELECT '2014', '1', 'A' FROM dual
UNION ALL SELECT '2013', '1', 'A' FROM dual
UNION ALL SELECT '2012', '2', 'A' FROM dual
UNION ALL SELECT '2015', '1', 'B' FROM dual
UNION ALL SELECT '2014', '2', 'B' FROM dual
UNION ALL SELECT '2014', '1', 'B' FROM dual
UNION ALL SELECT '2013', '2', 'B' FROM dual
UNION ALL SELECT '2013', '1', 'B' FROM dual
UNION ALL SELECT '2012', '2', 'B' FROM dual
UNION ALL SELECT '2014', '1', 'C' FROM dual
UNION ALL SELECT '2013', '2', 'C' FROM dual
UNION ALL SELECT '2013', '1', 'C' FROM dual
UNION ALL SELECT '2015', '1', 'D' FROM dual
UNION ALL SELECT '2014', '2', 'D' FROM dual
UNION ALL SELECT '2013', '2', 'D' FROM dual
UNION ALL SELECT '2013', '1', 'D' FROM dual
)
-- 1. 계층 쿼리를 이용해 봤습니다.
SELECT id
     , DECODE(CONNECT_BY_ROOT(yy||hg), '20151', rk, 0) cnt
  FROM (SELECT id, yy, hg
             , RANK() OVER(PARTITION BY id ORDER BY yy DESC, hg DESC) rk
          FROM t
        )
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH rk = 1
 CONNECT BY id = PRIOR id
   AND rk = PRIOR rk + 1
   AND yy = DECODE(PRIOR hg, 2, PRIOR yy, PRIOR yy-1)
   AND hg = DECODE(PRIOR hg, 2, 1, 1, 2)
;


-- 2. Lag 함수를 이용한 연속 카운트
SELECT id
     , COUNT(DECODE(yyhg, '20151', 1)) cnt
  FROM (SELECT id, yy, hg
             , MAX(yy||hg) OVER(PARTITION BY id) yyhg
             , SUM(CASE WHEN yy = yy1   AND hg = 1 AND hg1 = 2 THEN 0
                        WHEN yy = yy1-1 AND hg = 2 AND hg1 = 1 THEN 0
                        ELSE 1 END
                   ) OVER(PARTITION BY id ORDER BY yy DESC, hg DESC) gb
          FROM (SELECT id, yy, hg
                     , LAG(yy) OVER(PARTITION BY id
                                        ORDER BY yy DESC, hg DESC) yy1
                     , LAG(hg) OVER(PARTITION BY id
                                        ORDER BY yy DESC, hg DESC) hg1
                  FROM t
                )
        )
 WHERE gb = 1
 GROUP BY id
 ORDER BY id
;

마농(manon94)님이 2015-03-04 15:22에 작성한 댓글입니다.
이 댓글은 2015-03-04 15:32에 마지막으로 수정되었습니다.

헐.. 뭔 쿼리 인지는 잘 모르겠지만 공부를 해보겠습니다.

빛이 보이는것 같습니다. 너무너무 감사합니다. 마농님 ㅠ,.ㅠ

 

트랄랄라(hyoji)님이 2015-03-04 15:34에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40731이름이 다르고, 테이블 구조가 동일한 테이블 데이터 합치기 [1]
choiksn
2015-03-06
7069
40730통계 화면 개발 쿼리 문의좀 드립니다. [1]
김미나
2015-03-05
7606
40729체크쿼리 어떻게 만들어야 할까요? [1]
궁금맨
2015-03-05
6934
40728oracle 분석함수 질문입니다. [12]
트랄랄라
2015-03-04
9437
40727정해진 수대로 레코드 분할 [1]
시로73
2015-03-02
6673
40725제조일자별 선입선출 쿼리문의 [2]
량디
2015-02-27
8992
40724[질문] 연속된 순차자료 우측으로 표현 [1]
안동석
2015-02-26
6762
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.029초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다