2017-08-11 84 views
2

我有一个oracle表DM_TEMP_SUMMING_DVC_BY_FW,具有以下列和示例数据。下面 数据显示Oracle - 创建值链并计算累积计数

-dmc_id ='408' there are 2109 devices which are having firmware_version='RT1' and it is the first firmware_version because image_prerequisite is null for this firmware_image. 

    -dmc_id ='408' there are 40 devices which are having firmware_version='RT2' moved from "RT1" and so on. 

    +-----------+-------+-----------------+------------+------------------+ 
    device_count| dmc_id| firmware_version| cg_id  |image_prerequisite| 
    +-----------+-------+-----------------+------------+------------------+ 
    | 40  | 408 |RT2    |0000  |RT1    | 
    | 24  | 408 |RT3    |0000  |RT2    | 
    | 18  | 408 |RT4    |0000  |RT3    | 
    | 2109  | 408 |RT1    |0000  |null    | 
    +-----------+-------+-----------------+------------+------------------+ 

要求是创建firmware_versions的链,并通过链移动设备的计数。 例如:

Firmware_version movement is RT1-->RT2-->RT3-->RT4 
so the count of devices moved from RT1 to RT4 is (RT1+RT2+RT3+RT4) 
count of devices moved from RT2 to RT4 is (RT2+RT3+RT4) 
count of devices moved from RT3 to RT4 is (RT3+RT4) 
count of devices at last firmware_version is RT4 



+--------------------+-------+-----------------+-------+--------------------+ 
cumm_device_count | dmc_id| firmware_version| cg_id |chain    | 
+--------------------+-------+-----------------+-------+--------------------+ 
| 82(40+24+18)  | 408 |RT2    |0000 |null/RT1/RT2  | 
| 42(24+18)   | 408 |RT3    |0000 |null/RT1/RT2/RT3 | 
| 18     | 408 |RT4    |0000 |null/RT1/RT2/RT3/RT4| 
| 2191(2109+40+24+18)| 408 |RT1    |0000 |null/RT1   | 
+--------------------+-------+-----------------+-------+--------------------+ 

我曾尝试使用下面的查询基于firmware_version和image_prerequisite链,但预期它没有返回结果。该查询返回28条记录。

SELECT dmc_id, firmware_version, charging_group_id, image_prerequisite, SYS_CONNECT_BY_PATH(firmware_version,'/') TrackingFW 
from DM_TEMP_SUMMING_DVC_BY_FW 
where FIRMWARE_VERSION in ('RT1','RT2','RT3','RT4') and dmc_id='408' and charging_group_id='0000' 
CONNECT BY NOCYCLE PRIOR firmware_version=image_prerequisite; 

请建议查询或程序来解决这个要求。

在此先感谢!

回答

0

试试这个;

select 
SYS_CONNECT_BY_PATH(firmware_version, '/') path_, 
firmware_version, 
device_count, 
dmc_id, 
cg_id , 
(
select sum(device_count) 
from DM_TEMP_SUMMING_DVC_BY_FW t2 
start with t1.firmware_version=t2.firmware_version CONNECT BY nocycle PRIOR firmware_version=image_prerequisite 
) sum_device 
from DM_TEMP_SUMMING_DVC_BY_FW t1 
start with image_prerequisite is null CONNECT BY nocycle PRIOR firmware_version =image_prerequisite 
+0

我编辑过,我认为它的工作原理。你能试一下吗? –

+0

谢谢!此查询适用于我:) –

+0

我已添加查询已返回的结果。请帮我解决问题的结果。 –