test_3
, test_2
및 test_1
의 세 테이블 사이에 조인이 있습니다.GROUP BY CLOB 데이터를 가져 오는 중
test_1
및 test_3
은 주 테이블이며 공통 열은 없습니다. 테이블 test_2
에 의해 결합됩니다. test_1
는 sr_id
, last_updated_date
,
test_2
가 sr_id
및 sm_id
및 test_3
가 sm_id
, sql_statement
을 가지고 있음. test_3
에는 모든 문제를 일으키는 clob 데이터가 있습니다.
sm_id
과 관련된 최신 sr_id
을 찾아야합니다. 내 생각은 집계 함수 max(last_updated_date)
을 사용하여 그룹화했습니다. 그리고 그것은 여러 가지 이유로 발생하지 않습니다.
이 열은 sql_statement 인 CLOB 데이터를 포함합니다.
내가 익숙하지 않은 조인을 사용했습니다.
모든 아이디어가 도움이 될 것입니다.
WITH xx as (
(select ANSWER ,sr_id AS ID from test
WHERE Q_ID in (SELECT Q_ID FROM test_2 WHERE field_id='LM_LRE_Q6')
)
)
-- end of source data
SELECT t.ID, t1.n, t1.SM_ID,seg_dtls.SEGMENTation_NAME ,to_char(mst.LAST_UPDATED_DATE,'dd-mon-yyyy hh24:mi:ss'),seg_dtls.sql_statement
FROM xx t
CROSS JOIN LATERAL (
select LEVEL AS n, regexp_substr(t.answer, '\d+', 1, level) as SM_ID
from dual
connect by regexp_substr(t.answer, '\d+', 1, level) IS NOT NULL
) t1
left join test_1 mst
on mst.sr_id=t.id
right join test_3 seg_dtls
on seg_dtls.sm_id=t1.sm_id;
샘플 데이터는
sr_id sm_id SEGMENTATION_NAME LAST_UPDATED_DATE
1108197 958 test_not_in 05-feb-2017 23:56:59
1108217 958 test_not_in 14-feb-2017 00:37:39
1108218 958 test_not_in 14-feb-2017 01:39:50
1108220 958 test_not_in 14-feb-2017 03:39:07
과 같을 것이다 및 예상 출력은 거대한이기 때문에이 CLOB 데이터를 게시하고 있지 않다
1108220 958 test_not_in 14-feb-2017 03:39:07
입니다. 모든 행에는 CLOB 데이터가 들어 있습니다.
table test_3 contains
q_id sr_id answer
1009330 1108246 976~feb_24^941~Test_regionwithcountry
1009330 1108247 941~Test_regionwithcountry_2016^787~Test_Request_28^976~feb_24
1009330 1108239 972~test_emea
1009330 1108240 972~test_emea^827~test_with_region_country
1009330 1108251 981~MSE100579729 testing.
및 샘플 데이터의 위 test_3
대답 sm_id을 포함 같습니다. 나는 여기에서 그것을 끌어 야한다. 예를 들어
:
941~Test_regionwithcountry_2016^787~Test_Request_28^976~feb_24
the sm_id is 941,787,976
.
위의 쿼리를 위와 같이 게시했습니다.
다시 왼쪽 및 오른쪽 조인을 사용하면 test_3의 모든 sm_id가 필요하므로 여기에 올바른 조인을 사용했습니다.
edit1 : 허용되는 대답은 최대 (last_updated_date)와 함께 SR_ID OF SEGMENTS를 제공합니다.
모든 SR_ID가 필요합니다. 그래서 MINUS 연산자를 사용하여 max (last_updated_date)가 아닌 연산자를 얻습니다.
그 결과를 허용 된 답변에 추가해야합니다.
이것은 다른 SR_ID를 얻으려고 한 것입니다.
select sr_id,segmentation_name,request_status from (with test_31 (q_id, sr_id, answer) as (
(SELECT Q_ID,SR_ID,ANSWER FROM test_3 WHERE Q_ID=(SELECT Q_ID FROM test_4 WHERE FIELD_ID='LM_LRE_Q6'))
),
answer_extraction as (
select q_id, sr_id,
regexp_substr(regexp_substr(answer, '[^^]+', 1, level),'\d+') as sm_id
from test_31
connect by q_id = prior q_id
and sr_id = prior sr_id
and prior dbms_random.value is not null
and regexp_substr(answer, '[^^]+', 1, level) is not null
)
select sr_id,
sm_id,
segmentation_name,
LAST_UPDATED_DATE,
sql_statement,request_status
from (
select t1.sr_id,
t2.sm_id,
t2.segmentation_name,
t1.last_updated_date,
t2.sql_statement,
t1.request_status
from test_4 t4
join answer_extraction t3 on t3.q_id = t4.q_id
join test_2 t2 on t2.sm_id = t3.sm_id
join test1 t1 on t1.sr_id = t3.sr_id
)
)
minus
(select sr_id,segmentation_name , request_status from (with test_31 (q_id, sr_id, answer) as (
(SELECT Q_ID,SR_ID,ANSWER FROM test_3 WHERE Q_ID=(SELECT Q_ID FROM test_4 WHERE FIELD_ID='LM_LRE_Q6'))
),
answer_extraction as (
select q_id, sr_id,
regexp_substr(regexp_substr(answer, '[^^]+', 1, level), '\d+') as sm_id
from test_31
connect by q_id = prior q_id
and sr_id = prior sr_id
and prior dbms_random.value is not null
and regexp_substr(answer, '[^^]+', 1, level) is not null
)
select sr_id,
segmentation_name,
sql_statement,
request_status
from (
select t1.sr_id,
t2.sm_id,
t2.segmentation_name,
t1.last_updated_date,
t2.sql_statement,
t1.request_status,
max(t1.last_updated_date) over (partition by t2.sm_id) as max_updated_date
from test_4 t4
join answer_extraction t3 on t3.q_id = t4.q_id
join test_2 t2 on t2.sm_id = t3.sm_id
join test_1 t1 on t1.sr_id = t3.sr_id
)
where last_updated_date = max_updated_date));
}
샘플 데이터 :
허용 대답 세그먼트의 최대 (LAST_UPDATED_DATE)로 출력 이하 준다.
1097661 Submitted o2k lad 30-NOV-15 01-DEC-16 62 CLOB DATA
위의 게시 된 쿼리는 다른 업데이트 된 날짜가있는 세그먼트의 sr_id보다 아래에 출력됩니다.
1097621 o2k lad Submitted
1097625 o2k lad Submitted
1097627 o2k lad Submitted
1097632 o2k lad Submitted
1097633 o2k lad Submitted
1097658 o2k lad Pending
1097640 o2k lad Submitted
1097644 o2k lad Submitted
1097646 o2k lad Submitted
예상 출력 : 마지막 열이 기존의 모든 SR_ID를 포함 있도록
sr_id status segment_name updated_date sql_statement other_sr_id
1097661 Submitted o2k lad 30-NOV-15 CLOB DATA 1097618,1097621,1097625,1097627,1097632,1097633,1097658,1097640,1097644,1097646
는 두 개의 쿼리를 결합합니다.
샘플 입력 데이터 및 예상 출력을 게시하십시오. 모든 사용자에게 도움이 될 것입니다. – Tajinder
'max (last_updated_date) '를 사용하려는 원래의 계획은 질문의 코드보다 훨씬 더 유망한 것 같습니다. 어쩌면 다시 시작해야 할 것입니다. –
나도 알아하지만 모든 열에는 clob이 들어있는 열도 필요하다. – user3165555