2016-04-03 68 views
2

有人可以幫助實現下述要求的想法:的Oracle SQL查詢邏輯 - 集團基於日期的差異

enter image description here

表上方(截圖)維護計劃流程的工作歷史。

我的要求是有一個目標表維護累積歷史,如下圖所示。

enter image description here

參閱以下源/目標表結構和源樣本記錄的SQL代碼:

CREATE TABLE "XHQ"."SHIFT_LOG" ("SEQUENCE_ID" NUMBER(10,0), 
"JOB_ID" NUMBER(10,0), 
"START_TS" DATE, 
"END_TS" DATE, 
"MINIMUM_VALUE" FLOAT(126), 
"MAXIMUM_VALUE" FLOAT(126), 
"AVERAGE_VALUE" FLOAT(126), 
"USERID" NVARCHAR2(80)); 

Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10908,12000,to_date('01-MAY-15','DD-MON-RR'),null,null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10825,12000,to_date('29-APR-15','DD-MON-RR'),to_date('01-MAY-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10800,12000,to_date('29-APR-15','DD-MON-RR'),to_date('29-APR-15','DD-MON-RR'),5,10,7.5,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10725,10500,to_date('28-APR-15','DD-MON-RR'),to_date('29-APR-15','DD-MON-RR'),4,8,6,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10625,10500,to_date('27-APR-15','DD-MON-RR'),to_date('27-APR-15','DD-MON-RR'),6,6,6,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10620,10500,to_date('23-APR-15','DD-MON-RR'),to_date('27-APR-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10525,10500,to_date('22-APR-15','DD-MON-RR'),to_date('23-APR-15','DD-MON-RR'),null,null,null,'admin'); 
Insert into XHQ.SHIFT_LOG (SEQUENCE_ID,JOB_ID,START_TS,END_TS,MINIMUM_VALUE,MAXIMUM_VALUE,AVERAGE_VALUE,USERID) values (10510,10500,to_date('18-APR-15','DD-MON-RR'),to_date('20-APR-15','DD-MON-RR'),8,16,8,'admin'); 

我舉的要求的概述。

考慮作業ID = 10500

  • 按sequenceid:10510,它已開始在4月18日,跑至20 - 4月一旦成功完成,它將獲得與其對應的最小,最大,平均值作爲摘要。

  • 但是,如果我們考慮序列號:10525,它從22月開始,一直運行到23月。但由於網絡中斷,中途停止了幾分鐘,然後重新開始。因爲它的min,max,avg值爲NULL,因爲作業是不完整的。它在27日再次發生了另一個網絡問題,因此它被停止並再次恢復。最後在27日apr(序號:10625)成功完成,min,max,avg分配給它。

enter image description here

屬於序列號的10625,10620和10525的需求這種情況下記錄的條目被視爲從序列編號10525層的需求單組和start_ts獲得分配給sequenceid 10625如下

enter image description here

以上情況的一個例外是,如果end_ts爲空(序列ID:10908)(它表示當前活動作業)。

enter image description here

這裏分組應該與序列ID:10825和輸出應該像如下屏幕截圖。

enter image description here

讓我知道如果你需要任何澄清。

在此先感謝您的寶貴時間和寶貴建議。

回答

2

嘗試:

SELECT sequence_id, job_id, new_start_ts as start_ts, end_ts, 
     minimum_value, maximum_value, average_value, userid 
FROM (
    SELECT t.*, 
      min(start_ts) over (partition by job_id, new_seq_id) As new_start_ts 
    FROM (
      SELECT t.* , 
       first_value(case when minimum_value is not null then sequence_id end IGNORE NULLS) 
       over (partition by job_id order by sequence_id rows between current row and unbounded following) as new_seq_id 
      FROM SHIFT_LOG t 
    ) t 
) 
WHERE minimum_value IS NOT NULL 
    OR new_seq_id IS NULL AND end_ts IS NULL 
ORDER BY sequence_id desc; 
+0

你能告訴邏輯運算符的執行在何處,是像1)爲了'(MINIMUM_VALUE IS NOT NULL 或new_seq_id IS NULL)AND end_ts IS NULL'或者是它像2)'minimum_value IS NOT NULL OR(new_seq_id IS NULL AND end_ts IS NULL)'。我的意思是首先評估哪一個。 –

+0

@sql_dummy SQL標準沒有定義條件'x OR y AND z'的評估順序,與例如Java,C++相反。數據庫可以自由選擇任何評估順序,但它更好。 SQL是聲明性語言 - 我不關心評估的順序,我只聲明:「給我條件爲'x OR y AND z'爲真的行' – krokodilko

+0

但是這不會改變reult?假設'case1'中'x爲true,y爲false,z爲false',where條件將返回false,'case2'條件將返回true –