티스토리 뷰

728x90

두 사람이 주고 받은 대화를 tb_tx와 tb_rx로 나누어서 저장한다.

두 테이블은 동일한 구조고, tx 한번, rx한번 순서대로 이야기를 한다.

tb_tx와 tb_rx는 아래의 컬럼을 가지고 있다

id 한 대화의 아이디
talk_text 발화 내용
talk_seq 발화 순서
regist_date 등록일

만약 regist_date가 rx와 tx가 동일하다면 단순히 union all로 데이터를 합쳐서 order by regist_date로 하면 될 것이다.

(union은 중복을 제거하기 때문에, 두 데이터의 중복이 확실히 없다면 union all을 쓰는게 성능면에서 좋다)

그런데 여기서 문제는 등록일이 동일하다는 것이다. why...왜 그렇게 되어있는지는 모른다..

 

이럴 때 해결 방법을 알아보자.

우선, tx가 대화를 먼저 시작하는데, 맨 처음 대화의 talk_text는 무조건 공백이다.

 

tx : "" - 2022-06-29 18:00

rx : "안녕하세요 tx님"  - 2022-06-29 18:00

tx : "네 안녕하세요. 반갑습니다" - 2022-06-29 18:01

rx : "왜 데이터 저장을 이렇게 한대요?" - 2022-06-29 18:01

tx : "저도 모르겠어요" - 2022-06-29 18:02

rx : "어렵네요" - 2022-06-29 18:02

 

이런 대화 내용이 각각의 tb_tx와 tb_rx에 각각의 대화 순서대로 데이터가 쌓인다고 할 때 두 데이터를 합쳐서 가져와보자

SELECT
	X.ID
	, X.TALK_TEXT
	, X.SPEAKER
	, X.SPEECH_NO
	, X.TALK_SEQ
    , X.REGIST_DATE
  FROM (
  		 SELECT ID
  			  , TALK_SEQ
			  , TALK_TEXT
			  , '0' AS SPEECH_NO 
			  , 'tx' AS SPEAKER
              , REGIST_DATE
		   FROM TB_TX
		  WHERE ID='chat_id'
			AND TALK_SEQ <> 1
  		  UNION ALL
		 SELECT ID
			  , TALK_SEQ
			  , TALK_TEXT
			  , '1' AS SPEECH_NO
			  , 'rx' AS SPEAKER
              , REGIST_DATE
		   FROM TB_CALL_BOT_LOG
		  WHERE ID='chat_id'
 ) X
 ORDER BY TALK_SEQ, SPEECH_NO

➡️ 실행 결과

ID TALK_TEXT SPEAKER SPEECH_NO TALK_SEQ REGIST_DATE
chat_id 안녕하세요 tx님 rx 1 1 2022-06-29 18:00
chat_id 네 안녕하세요. 반갑습니다 tx 0 2 2022-06-29 18:01
chat_id 왜 데이터 저장을 이렇게 한대요 rx 1 2 2022-06-29 18:01
chat_id 저도 모르겠어요 tx 0 3 2022-06-29 18:02
chat_id 어렵네요 rx 1 3 2022-06-29 18:02

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함