2015-03-31 51 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;