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 39984 게시물 읽기
No. 39984
특정데이터가 없을때 조회쿼리(질문수정)
작성자
왕대가르시아(왕대가르시아)
작성일
2013-01-24 11:44ⓒ
2013-02-05 22:26ⓜ
조회수
6,856

 --- 질문이 잘못되어 수정을 좀 했습니다. 죄송합니다.

머리가 굳었는지 아님 원래 이런건지 미숙자 도움을 구합니다.

 

 

 

 

 WITH t AS                             
 (                                     
 SELECT 'XXX' AS ITEM, 'SEOUL' AS AREA,'RECEV'  AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120105' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'JEJU'  AS AREA,'RETURN' AS EVENT ,'20120106' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'JEJU'  AS AREA,'SEND'   AS EVENT ,'20120107' AS TIME FROM DUAL UNION ALL 
 SELECT 'XXX' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120108' AS TIME FROM DUAL UNION ALL 
 SELECT 'BBB' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL 
 SELECT 'BBB' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL 
 SELECT 'CCC' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL 
 SELECT 'CCC' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL 
 SELECT 'CCC' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL 
 SELECT 'CCC' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL 
 SELECT 'CCC' AS ITEM, 'JEJU'  AS AREA,'DELIV'   AS EVENT ,'20120105' AS TIME FROM DUAL
)

 

 

위와 같은 데이터가 있습니다. 질문은 두가지 인데요

 Q1.ITEM 중에 BUSAN에 ARRIV 해서 다음 작업이 없는 데이터를 추출해야 하는데 데이터를 보면 XXX와 BBB는 둘다 부산에 ARRIV해서 다음 작업이 일어나지 않았습니다.

결과는 

XXX    BUSAN ARRIV 20120108

BBB    BUSAN ARRIV 20120103

두가지가 나와야 합니니다.

 Q2.EVENT중에 RECEV 값이 없는 데이터중 시간이 제일 빠른것 결과는   

BBB     SEOUL    SEND    20120102

 CCC     SEOUL    SEND     20120101  두가지가 나와야 합니다.
 

뭔가 쉬운듯 하면서도 안풀리네요.

내심 어려운 쿼리길 간절히 빌어봅니다.

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

 WITH t AS                            
 (                                    
 SELECT 1  AS NUM ,'AAA' AS ITEM, 'SEOUL' AS AREA,'RECEV'  AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 2  AS NUM ,'AAA' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 3  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 4  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 5  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120105' AS TIME FROM DUAL UNION ALL
 SELECT 6  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'RETURN' AS EVENT ,'20120106' AS TIME FROM DUAL UNION ALL
 SELECT 7  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'SEND'   AS EVENT ,'20120107' AS TIME FROM DUAL UNION ALL
 SELECT 8  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120108' AS TIME FROM DUAL UNION ALL
 SELECT 9  AS NUM ,'BBB' AS ITEM, 'SEOUL' AS AREA,'RECEV'  AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 10 AS NUM ,'BBB' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 11 AS NUM ,'BBB' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 12 AS NUM ,'BBB' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 13 AS NUM ,'BBB' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120105' AS TIME FROM DUAL UNION ALL
 SELECT 14 AS NUM ,'CCC' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 15 AS NUM ,'CCC' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 16 AS NUM ,'CCC' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 17 AS NUM ,'CCC' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 18 AS NUM ,'CCC' AS ITEM, 'JEJU'  AS AREA,'DELIV'   AS EVENT ,'20120105' AS TIME FROM DUAL
)
SELECT NUM, ITEM, AREA, EVENT, TIME FROM (      
SELECT NUM, ITEM, AREA, EVENT, TIME, ROW_NUMBER() OVER(ORDER BY TIME DESC) AS RN  FROM T
WHERE AREA = 'BUSAN' AND EVENT = 'ARRIV')
WHERE RN = 1 ;

 

Q1.ITEM 중에 BUSAN에 ARRIV 해서 다음 작업이 없는 데이터  중 최근값 결과는
 
 8                    AAA     BUSAN     ARRIV       20120108


 WITH t AS                            
 (                                    
 SELECT 1  AS NUM ,'AAA' AS ITEM, 'SEOUL' AS AREA,'RECEV'  AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 2  AS NUM ,'AAA' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 3  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 4  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 5  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120105' AS TIME FROM DUAL UNION ALL
 SELECT 6  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'RETURN' AS EVENT ,'20120106' AS TIME FROM DUAL UNION ALL
 SELECT 7  AS NUM ,'AAA' AS ITEM, 'JEJU'  AS AREA,'SEND'   AS EVENT ,'20120107' AS TIME FROM DUAL UNION ALL
 SELECT 8  AS NUM ,'AAA' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120108' AS TIME FROM DUAL UNION ALL
 SELECT 9  AS NUM ,'BBB' AS ITEM, 'SEOUL' AS AREA,'RECEV'  AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 10 AS NUM ,'BBB' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 11 AS NUM ,'BBB' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 12 AS NUM ,'BBB' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 13 AS NUM ,'BBB' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120105' AS TIME FROM DUAL UNION ALL
 SELECT 14 AS NUM ,'CCC' AS ITEM, 'SEOUL' AS AREA,'SEND'   AS EVENT ,'20120101' AS TIME FROM DUAL UNION ALL
 SELECT 15 AS NUM ,'CCC' AS ITEM, 'BUSAN' AS AREA,'ARRIV'  AS EVENT ,'20120102' AS TIME FROM DUAL UNION ALL
 SELECT 16 AS NUM ,'CCC' AS ITEM, 'BUSAN' AS AREA,'SEND'   AS EVENT ,'20120103' AS TIME FROM DUAL UNION ALL
 SELECT 17 AS NUM ,'CCC' AS ITEM, 'JEJU'  AS AREA,'ARRIV'  AS EVENT ,'20120104' AS TIME FROM DUAL UNION ALL
 SELECT 18 AS NUM ,'CCC' AS ITEM, 'JEJU'  AS AREA,'DELIV'   AS EVENT ,'20120105' AS TIME FROM DUAL
)
SELECT NUM, ITEM, AREA, EVENT, TIME FROM (      
SELECT NUM, ITEM, AREA, EVENT, TIME, ROW_NUMBER() OVER(ORDER BY TIME ASC) AS RN  FROM T
WHERE EVENT != 'RECEV')
WHERE RN = 1 ;

Q2.EVENT중에 RECEV 값이 없는 데이터중 시간이 제일 빠른것 결과는  
 
14               CCC     SEOUL    SEND     20120101 이 나와 야 합니다.
 

빈이님이 2013-01-25 10:40에 작성한 댓글입니다. Edit

 빈이// 빈이님 인사가 늦었습니다.  도움주신것 감사합니다. (__)(^^)

그런데 , 제가 질문을 좀 잘못 올린것 같습니다.

여러ITEM 이 질문한 상태에 포함되었을때 모두 나와야 되는것인데..

질문을 수정하였습니다. 죄송합니다.

왕대가르시아(왕대가르시아)님이 2013-02-05 22:27에 작성한 댓글입니다.
이 댓글은 2013-02-05 22:28에 마지막으로 수정되었습니다.

-- 1.1. Not Exists
SELECT *
  FROM t a
 WHERE area  = 'BUSAN'
   AND event = 'ARRIV'
   AND NOT EXISTS (SELECT 1
                     FROM t
                    WHERE item = a.item
                      AND time > a.time
                   )
;
-- 1.2. Group By, Having, Keep
SELECT item
     , MIN(area)  KEEP(DENSE_RANK LAST ORDER BY time) area
     , MIN(event) KEEP(DENSE_RANK LAST ORDER BY time) event
     , MAX(time) time
  FROM t
 GROUP BY item
HAVING MIN(area)  KEEP(DENSE_RANK LAST ORDER BY time) = 'BUSAN'
   AND MIN(event) KEEP(DENSE_RANK LAST ORDER BY time) = 'ARRIV'
;
-- 1.3. Row_number
SELECT item, area, event, time
  FROM (SELECT item, area, event, time
             , ROW_NUMBER() OVER(PARTITION BY item ORDER BY time DESC) rn
          FROM t
        )
 WHERE rn = 1
   AND area  = 'BUSAN'
   AND event = 'ARRIV'
;
-- 2.1. Group By, Having, Keep
SELECT item
     , MIN(area)  KEEP(DENSE_RANK FIRST ORDER BY time) area
     , MIN(event) KEEP(DENSE_RANK FIRST ORDER BY time) event
     , MIN(time) time
  FROM t
 GROUP BY item
HAVING COUNT(DECODE(event, 'RECEV', 1)) = 0
;
-- 2.2. Row_number
SELECT item, area, event, time
  FROM (SELECT item, area, event, time
             , ROW_NUMBER() OVER(PARTITION BY item ORDER BY time) rn
             , COUNT(DECODE(event, 'RECEV', 1)) OVER(PARTITION BY item) cnt
          FROM t
        )
 WHERE rn  = 1
   AND cnt = 0
;

마농(manon94)님이 2013-02-06 10:59에 작성한 댓글입니다.

 마농님// 포기하고 있었는데 와우~ 감사합니다.

답을 보고 살짝 소름돋았습니다.  마농님의 실력에 또 저의 무지에 ^^;

왕대가르시아(왕대가르시아)님이 2013-02-22 15:47에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39988오라클 소수점 처리
소수점
2013-01-28
6492
39987조회 데이터..
사랑
2013-01-25
5104
39985[급한 질문] 여러개 테이블을 조인하여 업데이트하기
이후영
2013-01-25
5365
39984특정데이터가 없을때 조회쿼리(질문수정) [4]
왕대가르시아
2013-01-24
6856
39983group by와 union, 그리고 order by.... 질문입니다. [2]
정성태
2013-01-24
7323
39982한번에 묶어서 표현하고 싶습니다. [1]
초보자
2013-01-23
5178
39981Update문 문의드립니다. [2]
새하정
2013-01-22
4762
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다