test_3
,test_2
およびtest_1
の3つの表の間に結合があります。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
には、すべての問題を引き起こすデータがあります。
最新のsr_id
がsm_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 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
最後の列は、すべての古いSR_IDを含むように、2つのクエリを兼ね備えています。
サンプル入力データと期待される出力を投稿してください。それは本当にすべてのユーザーに役立つでしょう。 – Tajinder
'max(last_updated_date) 'を使用する当初の計画は、あなたの質問のコードよりもはるかに有望です。多分あなたは再び始めるべきです。 –
私は知っていますが、すべての列が必要です。clobを含むものもあります。 – user3165555