2016-04-03 15 views
2

birisi aşağıda açıklanan gereksinimi uygulayan fikirlerle yardımcı olabilir.Oracle SQL sorgusu Mantık Grup tarafından tarihi Fark dayalı

Benim gereksinimim, ekran görüntüsünün altına göre birikimli geçmişi koruyan bir hedef tabloya sahip olmaktır.

enter image description here

kaynak/hedef tablo yapısı ve kaynak örnek kayıtları sql kodu için aşağıda bakınız:

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'); 

beni ihtiyacının bir bakış vereyim. 10510, Bu değer, 18 apr başladı ve 20 apr kadar koştu etti:

JobID sequenceid gereğince = 10500

  • düşünün. Başarıyla tamamlandığında, özet olarak ona karşılık gelen min, max, avg değeri elde edilir. Bununla birlikte, sıra numarası 10525'i düşünürsek, 22-nisan ile başladı ve 23-nisan'a kadar devam etti. Ancak bazı şebeke kesintileri nedeniyle birkaç dakika ortada durdu ve tekrar başladı. Bu nedenle, iş eksik olduğu için NULL olarak min, max, avg değerine sahiptir. Yine 27 Nisan'da başka bir ağ sorunu vardı, bu yüzden durduruldu ve tekrar devam etti. Sonunda 27 Nisan'da (sıra numarası: 10625) başarılı bir şekilde tamamlandı ve min, max, avg değeri atandı. dizi kimliğinin 10625, 10620 ve 10525 ihtiyaçlarına ait bu durumda kayıt girdileri olarak

    enter image description here

dizisi kimliği 10525 ihtiyaçlarına tek grup ve start_ts olarak kabul edilebilmesi için

aşağıda 10625 sequenceid atanmış olsun (o anda aktif iş belirtir): end_ts (10908 sekans kimliği) boş ise, yukarıda olduğu için

enter image description here

bir istisnası, bir. 10825 ve çıkış ekran aşağıdaki gibi olmalıdır:

enter image description here

Burada sekans kimliğine sahip olmalıdır gruplama.

enter image description here

Eğer herhangi açıklamalar gerekiyorsa bana bildirin.

Zaman ayırdığınız ve değerli önerileriniz için şimdiden teşekkür ederiz.

cevap

2

Dene:

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

Eğer MINIMUM_VALUE DEĞİL BOŞ VEYA new_seq_id IS NULL IS (') 1 gibi olduğu, mantıksal operatörlerin yürütme sırasını söyler misiniz) VE end_ts NULL' IS veya 2) 'asgari_değer NULL değil VEYA (new_seq_id IS NULL VE bit_ts IS NULL)' dir. Demek istediğim ilk önce değerlendiriliyor. –

+0

@sql_dummy SQL standardı, örneğin Java, C++ yerine, x OR y AND z' koşulunun değerlendirilme sırasını tanımlamaz. Veri tabanı, herhangi bir değerlendirme sırasını seçmekte serbesttir. SQL bildirim dilidir - Değerlendirmenin sırasını umursamıyorum, sadece şunu beyan ederim: "x OR y AND z" koşulunun doğru olduğu satırları bana ver " – krokodilko

+0

, ancak bu durumu değiştirmeyecek mi? Eğer x doğruysa, y yanlışsa, z durumun yanlış olduğu ve durumun geri döndüğü durumlarda 'durumda1' olduğunu varsayın. –