안녕하세요. 쿼리 작성을 하는 중인데 잘 안되서 도움을 요청 드립니다.
테이블은 두개가 있습니다.
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
;
알려주신 쿼리로 해결할 수 있게 되었습니다.
도움 감사합니다.