Hi everyone,
I have a big query (see below attached) in which all where clauses have sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel').
The value of ec.instantance_flux is like the format: "vx6000__12channel". I want to replace "channel" with "myChannel": "vx6000__12myChannel".
Since the query take all most 40 minutes, I want to "optimize" it to see if i can get it done in shorter time. My question is: are there any way just do once:
replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel')
and save its result into "temp". The other where clause just use
sc.channel = temp
instead of doing
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel')
for 12 times in my query.
Thanks for your help in advance.
OUyang
#####################################################333
select rt_data.r_flowmeter_caliber as r_flowmeter_caliber,
rt_data.r_max01_sloc as r_max01_sloc,
rt_data.r_max01_sdata as r_max01_sdata,
rt_data.r_max01_sdate as r_max01_sdate,
rt_data.r_min01_sdata as r_min01_sdata,
rt_data.r_min01_sdate as r_min01_sdate,
rt_data.r_avg01_sdata as r_avg01_sdata,
acc_data.r_end_sdate as r_end_sdate,
acc_data.r_end_sdata as r_end_sdata,
acc_data.r_start_sdate as r_start_sdate,
acc_data.r_start_sdata as r_start_sdata,
acc_data.r_acc_sdata as r_acc_sdata
from
( select ec.flowmeter_caliber as r_flowmeter_caliber,
max01.r_sloc as r_max01_sloc,
round(max01.r_sdata*100)/100 as r_max01_sdata,
max01.r_sdate as r_max01_sdate,
round(min01.r_sdata*100)/100 as r_min01_sdata,
min01.r_sdate as r_min01_sdate,
round(avg01.r_sdata*100)/100 as r_avg01_sdata,
max01.r_channel as r_channel,
max01.r_sid as r_sid,
max01.r_sloc as r_sloc
from (
select max(rd01.sensor_data) as r_sdata,
sc.external_ins as r_sloc,
rd01.sensor_id as r_sid,
(select rd02.sensor_date
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
where rd02.sensor_id = rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_data DESC limit 1
) as r_sdate,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, sc.external_ins, rd01.sensor_channel
) max01,
( select min(rd01.sensor_data) as r_sdata,
rd01.sensor_id as r_sid,
(select rd02.sensor_date
from record_data rd02, sensor_cfg sc, energy_classification02 ec
where rd02.sensor_id= rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_data ASC limit 1
) as r_sdate,
rd01.sensor_channel as r_channel
from record_data rd01, sensor_cfg sc, energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, rd01.sensor_channel
) min01,
( select avg(rd01.sensor_data) as r_sdata,
rd01.sensor_id as r_sid,
(select rd02.sensor_date from record_data rd02, sensor_cfg sc, energy_classification02 ec
where rd02.sensor_id = rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_data ASC limit 1
) as r_sdate,
rd01.sensor_channel as r_channel
from record_data rd01, sensor_cfg sc, energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel=rd01.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id,rd01.sensor_channel
) avg01,
energy_classification02 ec,
sensor_cfg sc
where max01.r_sid=min01.r_sid and
min01.r_sid=avg01.r_sid and
max01.r_sid=sc.sensor_id and
sc.channel = replace(split_part(trim(both ' ' from ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel= min01.r_channel and
sc.channel=max01.r_channel and
sc.channel=avg01.r_channel and
sc.external_ins=ec.measure_name and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
) rt_data,
( select round(max01.r_sdata-min01.r_sdata)*100/100 as r_acc_sdata,
max01.r_sid as r_sid, max01.r_sloc as r_sloc,
max01.r_sdate as r_end_sdate,
max01.r_sdata as r_end_sdata,
min01.r_sdate as r_start_sdate,
min01.r_sdata as r_start_sdata
from (
select max(rd01.sensor_date) as r_sdate,
sc.external_ins as r_sloc,
rd01.sensor_id as r_sid,
(select rd02.sensor_data
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
where rd02.sensor_id = rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_date DESC limit 1
) as r_sdata,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, sc.external_ins, rd01.sensor_channel
) max01,
( select min(rd01.sensor_date) as r_sdate,
rd01.sensor_id as r_sid,
(select rd02.sensor_data
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
where rd02.sensor_id= rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_date ASC limit 1
) as r_sdata,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, rd01.sensor_channel
) min01,
energy_classification02 ec,
sensor_cfg sc
where max01.r_sid=min01.r_sid and
max01.r_sid=sc.sensor_id and
sc.channel = replace(split_part(trim(both ' ' from ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel= min01.r_channel and
sc.channel=max01.r_channel and
sc.external_ins=ec.measure_name and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW') acc_data
where acc_data.r_sloc = rt_data.r_sloc
order by r_max01_sloc desc