在三個表格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)
並按它進行分組。 而且它沒有發生,原因很多。
它包含的CLOB數據列是sql_statement。
我已經使用了一個我不熟悉的連接。
任何想法都會有所幫助。
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
和預期輸出是
1108220 958 test_not_in 14-feb-2017 03:39:07
我不張貼CLOB數據,因爲它是巨大的。每行都包含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:接受的答案給出了帶有max(last_updated_date)的SEGMENTS的SR_ID。
我需要所有的SR_ID。所以,我使用MINUS運算符來獲取那些不是最大值的(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_DATELAST_UPDATED_TIME)。
1097661 Submitted o2k lad 30-NOV-15 01-DEC-16 62 CLOB DATA
上面發佈了查詢GIVES下面的輸出,它是帶有其他更新日期的段的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。
請郵寄樣本輸入數據和預期的輸出。這對所有用戶都有幫助。 – Tajinder
你最初的計劃使用'max(last_updated_date)'似乎比你的問題中的代碼更有前途。也許你應該重新開始。 –
我知道,但我需要的所有列,甚至包含一個CLOB – user3165555