안녕하세요. 쿼리 작성을 하는 중인데 잘 안되서 도움을 요청 드립니다.
테이블은 두개가 있습니다.
TABLE : BOOK
MEMBR_SEQ | BOOK | DATE |
7825 | 950106-00183EF | 2020-02-13 13:23 |
2206 | 950106-01847EF | 2020-02-13 14:36 |
7826 | K1049549EF | 2020-02-13 16:15 |
2206 | 950106-01231EF | 2020-02-13 16:15 |
7826 | K1049154EF | 2020-02-13 16:20 |
TABLE : LOG
MEMBR_SEQ | DATE |
2206 | 2020-02-13 17:43 |
2206 | 2020-02-13 17:43 |
6784 | 2020-02-13 17:43 |
7825 | 2020-02-13 17:44 |
7825 | 2020-02-13 17:44 |
5002 | 2020-02-13 17:49 |
7826 | 2020-02-13 17:50 |
7826 | 2020-02-13 17:50 |
7826 | 2020-02-13 17:50 |
7826 | 2020-02-13 17:50 |
원하는 것은 아래와 같습니다.
1. BOOK 테이블의 MEMBR_SEQ 별로 DATE 마지막 날짜의 BOOK 정보를 추출합니다.
MEMBR_SEQ | BOOK |
7826 | K1049154EF |
2206 | 950106-01231EF |
7825 | 950106-00183EF |
2. LOG 테이블에 1번 결과를 조인해서 BOOK 정보를 가져옵니다.
MEMBR_SEQ | BOOK | DATE |
2206 | 950106-01231EF | 2020-02-13 17:43 |
2206 | 950106-01231EF | 2020-02-13 17:43 |
6784 | null | 2020-02-13 17:43 |
7825 | 950106-00183EF | 2020-02-13 17:44 |
7825 | 950106-00183EF | 2020-02-13 17:44 |
5002 | null | 2020-02-13 17:49 |
7826 | K1049154EF | 2020-02-13 17:50 |
7826 | K1049154EF | 2020-02-13 17:50 |
7826 | K1049154EF | 2020-02-13 17:50 |
7826 | K1049154EF | 2020-02-13 17:50 |
3. 2에서 BOOK을 기준으로 GROUP BY 해서 카운트를 합니다.
그래서 최종은 아래와 같이 뽑고 싶습니다.
BOOK | COUNT |
950106-01231EF | 2 |
950106-00183EF | 2 |
K1049154EF | 4 |
null | 2 |
한참을 삽질해 보았지만, 제 짧은 지식으로는 원하는 결과를 구할 수 가 없네요.
쿼리에 도움 주시거나 해결을 위한 힌트라도 알려주신 다면 감사하겠습니다.
WITH book_t AS ( SELECT 7825 membr_seq, '950106-00183EF' book, '2020-02-13 13:23' dt FROM dual UNION ALL SELECT 2206, '950106-01847EF', '2020-02-13 14:36' FROM dual UNION ALL SELECT 7826, 'K1049549EF' , '2020-02-13 16:15' FROM dual UNION ALL SELECT 2206, '950106-01231EF', '2020-02-13 16:15' FROM dual UNION ALL SELECT 7826, 'K1049154EF' , '2020-02-13 16:20' FROM dual ) , log_t AS ( SELECT 2206 membr_seq, '2020-02-13 17:43' dt FROM dual UNION ALL SELECT 2206, '2020-02-13 17:43' FROM dual UNION ALL SELECT 6784, '2020-02-13 17:43' FROM dual UNION ALL SELECT 7825, '2020-02-13 17:44' FROM dual UNION ALL SELECT 7825, '2020-02-13 17:44' FROM dual UNION ALL SELECT 5002, '2020-02-13 17:49' FROM dual UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual ) SELECT b.book , COUNT(*) cnt FROM log_t a , (SELECT membr_seq, book FROM (SELECT membr_seq, book , ROW_NUMBER() OVER(PARTITION BY membr_seq ORDER BY dt DESC) rn FROM book_t ) WHERE rn = 1 ) b WHERE a.membr_seq = b.membr_seq(+) GROUP BY b.book ;