특정시간대만 비교해서 중복값을 제외하고 싶어요~! 0 9 1,648

by 뽀꼼여사 [SQL Query] SQL QUERY 중복값제거 [2017.08.07 15:41:26]


* 구하고자 하는 Data : 전날 18시에 해당되는 Type과 다음날 00시에 해당되는 Type을 비교했을 때(예 : 8/1 18시와 8/2 00시를 비교),

                             중복값이 있으면 다음날 22시에서는 제외하고, 그 외 모든 Data는 유지한다

                            

구분 TYPE
8/1 00시 A
8/1 00시 B
8/1 00시 C
8/1 06시 C
8/1 06시 E
8/1 06시 G
8/1 12시 A
8/1 12시 I
8/1 12시 F
8/1 18시 B
8/1 18시 D
8/1 18시 G
8/2 00시 B
8/2 00시 C
8/2 00시 E
8/2 00시 H
8/2 06시 A
8/2 06시 D
8/2 06시 J
8/2 06시 B
8/2 12시 S
8/2 12시 E
8/2 18시 D
8/2 18시 Y
8/3 00시 C
8/3 00시 E
8/3 00시 G
8/3 00시 A
8/3 06시 I
8/3 06시 F
8/3 06시 B
8/3 12시 D
8/3 12시 G
8/3 18시 B
8/3 18시 C
8/3 18시 A
by 마농 [2017.08.07 15:59:51]

1. 예시 자료의 날짜에 오타가 있는 듯 하구요.
2. 모호한 표현보다는 원본 대비 원하시는 결과표를 보여주세요.
3. 날짜 및 시간 자료의 실제 저장형태를 알려주세요.
  - date type 인지? varchar2 type 인지?
  - 어떤 포멧으로 저장되어 있는지?
  - 컬럼이 하나인지, 나뉘어져 있는지?


by 뽀꼼여사 [2017.08.07 16:30:11]

Data는 다시 확인수정했구여~

컬럼이 날짜, 구분(날짜+시간), TYPE 이렇게 총 3갠데요, 업로드가 안돼서 날짜 컬럼은 빼고 올렸어요~

그리고, 날짜 기준으로 Type 수를 중복 없이 Count하려고 하는데요,

이때 전날 마지막 시간(18시)과, 다음날 첫 시간(00시)에 대해서는 추가 중복을 제거하려고 합니다.


by 마농 [2017.08.07 16:35:28]

제 질문에 대한 답변으로는 부족하네요.
컬럼이 3개인데 각 컬럼의 타입과 형식을 정확하게 알려주세요.
1. 날짜 항목의 자료형이 Date 인지?
2. 구분 항목의 실제 데이터가 '8/1 00시' 형태로 들어가 있지는 않겠죠? 설마...
3. 모호한 설명 말고... 원하시는 결과표를 그려주세요.
 


by 뽀꼼여사 [2017.08.07 16:50:08]

구분 컬럼은 8/1 00시 형태로 TO_CHAR 사용하여 문자열변경 한 상태예요~

결과값은 각 일자별 TYPE 가지수를 COUNT 하는건데요,

이전날짜 마지막 시간과 다음날짜의 첫시간에 연결되는 동일 TYPE에 대해서는 다음날에서 COUNT하지 않게 하고 싶어요~

글로 설명하려니.. 어렵네여ㅠㅠㅠ그림 삽입하는데 제한이 걸려서 ㅠㅠ이해부탁드립니다 ㅠ


by 뽀꼼여사 [2017.08.07 16:46:40]
날짜 구분 A B C D E F G H I J S 결과
8/1 00시 1   1               1 8
  06시       1 1   1          
  12시 1   1     1            
  18시   1   1     1          
8/2 00시   1 1   1     1       7
  06시 1     1           1    
  12시   1     1         1    
  18시 1   1                  
8/3 00시 1   1   1   1         8
  06시   1       1     1      
  12시       1     1          
  18시           1       1 1  

by 마농 [2017.08.07 17:27:58]

이게 원하시는 결과표인가요?
아니면 결과를 도출하는 과정을 보여주기 위한 건가요?
최종 일자별 건수만 나오면 되나요? 위 표와 같이 나와야 하나요?


by 뽀꼼여사 [2017.08.07 17:31:22]

최종으로 날짜와 결과표만 얻고 싶어요~~


by 마농 [2017.08.07 17:49:47]
WITH t AS
(
SELECT TO_DATE('2017/08/01 00', 'yyyy/mm/dd hh24') dt, 'A' tp FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 00', 'yyyy/mm/dd hh24'), 'B' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 00', 'yyyy/mm/dd hh24'), 'C' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 06', 'yyyy/mm/dd hh24'), 'C' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 06', 'yyyy/mm/dd hh24'), 'E' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 06', 'yyyy/mm/dd hh24'), 'G' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 12', 'yyyy/mm/dd hh24'), 'A' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 12', 'yyyy/mm/dd hh24'), 'I' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 12', 'yyyy/mm/dd hh24'), 'F' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 18', 'yyyy/mm/dd hh24'), 'B' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 18', 'yyyy/mm/dd hh24'), 'D' FROM dual
UNION ALL SELECT TO_DATE('2017/08/01 18', 'yyyy/mm/dd hh24'), 'G' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 00', 'yyyy/mm/dd hh24'), 'B' FROM dual  -- 제외대상
UNION ALL SELECT TO_DATE('2017/08/02 00', 'yyyy/mm/dd hh24'), 'C' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 00', 'yyyy/mm/dd hh24'), 'E' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 00', 'yyyy/mm/dd hh24'), 'H' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 06', 'yyyy/mm/dd hh24'), 'A' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 06', 'yyyy/mm/dd hh24'), 'D' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 06', 'yyyy/mm/dd hh24'), 'J' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 06', 'yyyy/mm/dd hh24'), 'B' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 12', 'yyyy/mm/dd hh24'), 'S' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 12', 'yyyy/mm/dd hh24'), 'E' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 18', 'yyyy/mm/dd hh24'), 'D' FROM dual
UNION ALL SELECT TO_DATE('2017/08/02 18', 'yyyy/mm/dd hh24'), 'Y' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 00', 'yyyy/mm/dd hh24'), 'C' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 00', 'yyyy/mm/dd hh24'), 'E' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 00', 'yyyy/mm/dd hh24'), 'G' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 00', 'yyyy/mm/dd hh24'), 'A' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 06', 'yyyy/mm/dd hh24'), 'I' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 06', 'yyyy/mm/dd hh24'), 'F' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 06', 'yyyy/mm/dd hh24'), 'B' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 12', 'yyyy/mm/dd hh24'), 'D' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 12', 'yyyy/mm/dd hh24'), 'G' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 18', 'yyyy/mm/dd hh24'), 'B' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 18', 'yyyy/mm/dd hh24'), 'C' FROM dual
UNION ALL SELECT TO_DATE('2017/08/03 18', 'yyyy/mm/dd hh24'), 'A' FROM dual
)
SELECT TO_CHAR(a.dt, 'yyyymmdd') dt
     , COUNT(DISTINCT a.tp) cnt
  FROM t a
  LEFT OUTER JOIN t b
    ON TO_CHAR(a.dt, 'hh24') = '00'
   AND TO_CHAR(a.dt - 6/24, 'yyyymmdd hh24') = TO_CHAR(b.dt, 'yyyymmdd hh24')
   AND a.tp = b.tp
 WHERE b.tp IS NULL
 GROUP BY TO_CHAR(a.dt, 'yyyymmdd')
;

 


by 뽀꼼여사 [2017.08.08 10:33:23]

답변 감사드립니다. 도움주셔서 감사합니다!

너무 심플해서 깜짝 놀랐어요~~~

모수가 달라서 이전시간대와 다음시간대의 제품이 겹치는 부분을 어떻게 특정시간만 중복제거해야할지 막막했는데 ㅠ

감사합니다~!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입