How can I execute a least cost routing query in postgresql, without temporary tables? -
how can execute telecoms least cost routing query in postgresql? purpose generate result set ordered lowest price carriers. table structure below
create table tariffs ( trf_tariff_id integer, trf_carrier_id integer, trf_prefix character varying, trf_destination character varying, trf_price numeric(15,6), trf_connect_charge numeric(15,6), trf_billing_interval integer, trf_minimum_interval integer );
for instance check cost call if passed through particular carrier carrier_id query is:
select trf_price, trf_prefix lmp tariffs substring(dialled_number,1, length(trf_prefix)) = trf_prefix , trf_carrier_id = carrier_id order trf_prefix desc limit 1
for cost of call each carrier ie least cost query query is:
-- select * tariffs select distinct banana2.longest_prefix, banana2.trf_carrier_id_2, apple2.trf_carrier_id, apple2.lenprefix, apple2.trf_price, apple2.trf_destination (select banana.longest_prefix, banana.trf_carrier_id_2 (select max(length(trf_prefix)) longest_prefix, trf_carrier_id trf_carrier_id_2 (select *, length(trf_prefix) lenprefix tariffs substring('35567234567', 1, length(trf_prefix) )= trf_prefix) apple group apple.trf_carrier_id) banana) banana2, (select *, length(trf_prefix) lenprefix tariffs substring('35567234567', 1, length(trf_prefix) )= trf_prefix) apple2 -- group apple2.trf_carrier_id banana2.trf_carrier_id_2=apple2.trf_carrier_id , banana2.longest_prefix=apple2.lenprefix order trf_price
the query works on basis each carrier longest matching prefix dialled number unique , longest. join involving longest prefix , carrier on selection gives set carriers.
i 1 problem query:
i don't want apple(x) query twice
(select *, length(trf_prefix) lenprefix tariffs substring('35567234567', 1, length(trf_prefix) )= trf_prefix) apple
there must more elegant way, declaring once , using twice.
what want run query on single carrier each carrier:
select trf_price, trf_prefix lmp tariffs substring(dialled_number,1, length(trf_prefix)) = trf_prefix , trf_carrier_id = carrier_id order trf_prefix desc limit 1
and combine them 1 set sorted price.
in fact want generalize method such query output various values particular column or set of columns combined 1 set further querying. told ctes way accomplish kind of query find docs rather confusing. easier own use cases.
ps. aware prefix length can precomputed , stored.
common table expressions:
with apple ( select *, length(trf_prefix) lenprefix tariffs substring('35567234567', 1, length(trf_prefix)) = trf_prefix ) select distinct banana2.longest_prefix, banana2.trf_carrier_id_2, apple.trf_carrier_id, apple.lenprefix, apple.trf_price, apple.trf_destination (select banana.longest_prefix, banana.trf_carrier_id_2 (select max(length(trf_prefix)) longest_prefix, trf_carrier_id trf_carrier_id_2 apple group apple.trf_carrier_id) banana) banana2, apple banana2.trf_carrier_id_2 = apple.trf_carrier_id , banana2.longest_prefix = apple.lenprefix order trf_price
you can pull out repeated table definition. if i'm using 1 of sub-select-in-a-from things single time, still use ctes. find style you're using unreadable.
Comments
Post a Comment