2015-03-31 48 views
0
with sample_data as (select '26.03.2015 14:10' as adate, 4 as type, 40 as object, 111 as barcode from dual union all 
         select '26.03.2015 14:09' as adate, 1 as type, 55 as object, 222 as barcode from dual union all 
         select '26.03.2015 14:08' as adate, 2 as type, 33 as object, 777 as barcode from dual union all 
         select '26.03.2015 14:08' as adate, 2 as type, 34 as object, null as barcode from dual union all 
         select '26.03.2015 13:20' as adate, 3 as type, 41 as object, null as barcode from dual union all 
         select '26.03.2015 12:00' as adate, 1 as type, 56 as object, 444 as barcode from dual union all 
         select '26.03.2015 11:59' as adate, 2 as type, 37 as object, 555 as barcode from dual union all 
         select '26.03.2015 11:59' as adate, 2 as type, 48 as object, null as barcode from dual) 
    select 
    adate, type, object, barcode 
    from sample_data 
    where type in (1, 2); 

1型完成建設,2型是組件的一部分獲取對象的子對象的層次

我需要下一個結果

55 | 222 | 26.03.2015 14:08 | 33 
55 | 222 | 26.03.2015 14:08 | 34 
56 | 444 | 26.03.2015 11:59 | 37 
56 | 444 | 26.03.2015 11:59 | 38 

所以我們看到的反對包含子對象,和兩個日期= 26.03.2015 14:08 和對象包含子對象,和兩個日期= 2015年3月26日11時59分

開始我知道兩個參數 - 日期和成品建築物的條形碼,例如在我的數據 - 日期2015年3月26日14:09和條形碼或日期2015年3月26日12:00和條形碼

+0

是什麼對象和子對象之間的連接?是否由於按日期排序? – 2015-03-31 10:51:33

+0

當前對象類型爲1之前的所有以前的類型爲2的子對象 – 2015-03-31 11:14:59

回答

0

這個查詢做這項工作。子查詢T1將「類型1」與「類型2」連接起來。 T2使用函數row_number()枚舉它們。 最後查詢篩選只能用RN行數= 1

with t1 as (
    select t.*, prior object pob, prior barcode pbc, 
     prior adate pad, level, sys_connect_by_path(object, '-') pth 
    from sample_data t where level=2 
    connect by prior adate > adate and prior type = 1 and type = 2), 
t2 as (select t1.*, 
    row_number() over (partition by object order by pad) rn from t1) 
select pob, pbc, adate, object from t2 where rn = 1 

結果:

 POB  PBC ADATE    OBJECT 
---------- ---------- ------------------- ---------- 
     55  222 2015-03-26 14:08:00   33 
     55  222 2015-03-26 14:08:00   34 
     56  444 2015-03-26 11:59:00   37 
     56  444 2015-03-26 11:59:00   48 
0

你必須定義組,然後你可以分配的項目組

with sample_data as (select '26.03.2015 14:10' as adate, 4 as type, 40 as object, 111 as barcode from dual union all 
        select '26.03.2015 14:09' as adate, 1 as type, 55 as object, 222 as barcode from dual union all 
        select '26.03.2015 14:08' as adate, 2 as type, 33 as object, 777 as barcode from dual union all 
        select '26.03.2015 14:08' as adate, 2 as type, 34 as object, null as barcode from dual union all 
        select '26.03.2015 13:20' as adate, 3 as type, 41 as object, null as barcode from dual union all 
        select '26.03.2015 12:00' as adate, 1 as type, 56 as object, 444 as barcode from dual union all 
        select '26.03.2015 11:59' as adate, 2 as type, 37 as object, 555 as barcode from dual union all 
        select '26.03.2015 11:59' as adate, 2 as type, 48 as object, null as barcode from dual), 
    sd_groups as (select adate, lag(adate, 1) over (order by adate) adate_last, object, barcode from (
        select * from sample_data where type = 1 
        union all select min(adate), null, null, null from sample_data)) 
select sg.object, sg.barcode, sd.adate, sd.object 
from sample_data sd, sd_groups sg 
where sd.type = 2 and sd.adate between sg.adate_last and sg.adate;