2016-04-03 3 views
2

は、誰かが下記の要件を実装するアイデアを支援することができます。OracleのSQLクエリの論理グループによる日付の差に基づいては

私の要件は、以下のスクリーンショットに従って累積履歴を管理するターゲットテーブルを持つことです。

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 sequenceidを1として= 10500

  • 考えてみましょう:10510を、それは18 4月に開始し、20 - 4月まで走っています。正常に完了すると、サマリとしてそれに対応する最小、最大、平均値を取得します。

  • しかし、配列ID:10525を考慮すると、それは22-aprによって開始され、23-aprまで実行されました。しかし、何らかのネットワーク停止のために、数分間中断して再び開始しました。そのため、ジョブが不完全であるため、最小、最大、平均値がNULLになります。再びそれは27日に別のネットワークの問題を抱えていたので、停止して再開しました。最後に27th apr(sequence id:10625)に成功裏に完了し、最小、最大、平均値が割り当てられました。

    以下のように10625をsequenceidするために割り当てられますする

    シーケンスIDから単一のグループとstart_tsとして考慮されるべきシーケンス番号の10625、10620と10525のニーズ10525人のニーズに属するこの場合のレコードエントリで

enter image description here

enter image description here

end_tsがnullの場合(シーケンスID:10908)(現在アクティブなジョブを示しています)、上記の例外が1つあります。ここでグループ化

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が OR new_seq_idがNULL IS NULLではありません)AND end_tsはNULL'であるか、または2) 'minimum_value IS NOT NULL OR(new_seq_idはNULL、end_tsはNULL)'のようになります。どちらが最初に評価されるかを意味します。 –

+0

@sql_dummy SQL標準では、たとえばJava、C++ではなく、 'x OR y AND z'という条件の評価の順序は定義されていません。データベースは、thiksが優れている評価の順序を自由に選択できます。 SQLは宣言型言語です - 私は評価の順序は気にしません: "x OR y AND z'という条件が真である行を与えてください" – krokodilko

+0

しかし、それはreultを変更しませんか? 'xが真、yが偽、zが偽' 'case1'で条件がfalseを返し、' case2'で条件が真を返すとします。 –

関連する問題