[clue-tech] hairy sql (postgres) - suggestions welcome

Dave Price kinaole at gmail.com
Thu Nov 9 16:56:21 MST 2006


I am trying to analyze call records from an asterisk box and have an
almost working query that is pretty ugly - I wonder if anyone has any
suggestions...

I am grabbing a group  of  relevent rows into a temp table for further
analysis that looks like this:

   Column   |           Type           | Modifiers
------------+--------------------------+-----------
 calldate   | timestamp with time zone |
 src        | character varying(80)    |
 dst        | character varying(80)    |
 channel    | character varying(80)    |
 dstchannel | character varying(80)    |
 duration   | integer                  |

... here is the final query (without vraible parameters) that gives
totals by call direction (in or out) and counts by duration for a
range of durations ...

Any alternate strategies are welcome ... I am no SQL expert

..........................................
   Begin;
   create TEMP TABLE dap_test as
   SELECT calldate, src, dst,  channel, dstchannel, duration

      from CDR WHERE

      accountcode LIKE '%rockynet%' AND
      channel LIKE '%869%' AND
      created_datetime BETWEEN '2006-10-01' and '2006-11-01'
         OR
      accountcode LIKE '%rockynet%' AND
      dstchannel LIKE '%869%' AND
      created_datetime BETWEEN '2006-10-01' and '2006-11-01'

      order by uniqueid;

/* accountcode, channel(s) and date(s) should be parameters */

      create TEMP table dap_in as
         select   calldate::date, count(duration) as total ,
                  sum(duration) as total_time
         from dap_test

         where dstchannel like '%869%'  /* this should be a parameter */
         group by calldate::date
         order by calldate::date ;

      create TEMP table dap_out as
         select   calldate::date, count(duration) as total ,
                  sum(duration) as total_time
         from dap_test

         where    channel like '%869%'   /* this should be a parameter */
         group by calldate::date
         order by calldate::date ;

      create TEMP table dap_less_than_10 as
         select   calldate::date,
                  count(calldate::date) as less_than_10
         from dap_test

         where duration < 10
         group by calldate::date
         order by calldate::date;


      create TEMP table dap_ten_to_thirty as
         select   calldate::date,
                  count(calldate::date) as ten_to_thirty
         from dap_test

         where duration >= 10 and duration < 30
         group by calldate::date
         order by calldate::date;


      create TEMP table dap_thirty_to_sixty as
         select   calldate::date,
                  count(calldate::date) as thirty_to_sixty
         from dap_test

         where duration >= 30 and duration <60
         group by calldate::date
         order by calldate::date;


      create TEMP table dap_sixty_to_onetwenty as
         select   calldate::date,
                  count(calldate::date) as sixty_to_onetwenty
         from dap_test

         where duration >=60 and duration < 120
         group by calldate::date
         order by calldate::date;


      create TEMP table dap_more_than_120 as
         select   calldate::date,
                  count(calldate::date) as more_than_120
         from dap_test

         where duration >= 120
         group by calldate::date
         order by calldate::date;

/*     create table dap_report as */
     select
         t.* ,
         i.total as in_calls,
         i.total_time as in_time,

         o.total as out_calls,
         o.total_time as out_time,

         l.less_than_10,

         ten.ten_to_thirty,

         thirty.thirty_to_sixty,

         sixty.sixty_to_onetwenty,

         bigger.more_than_120

         from dap_all t
            left outer join
               dap_in i on t.calldate=i.calldate
                  left outer join
                     dap_out o  on  i.calldate=o.calldate
                        left outer join
                           dap_less_than_10 l on i.calldate=l.calldate
                              left outer join
                                 dap_ten_to_thirty ten on
i.calldate=ten.calldate
                                    left outer join
                                       dap_thirty_to_sixty thirty on
i.calldate=thirty.calldate
                                          left outer join
                                             dap_sixty_to_onetwenty
sixty on i.calldate=sixty.calldate
                                                left outer join
                                                   dap_more_than_120
bigger on i.calldate=bigger.calldate
         ;
/*     copy dap_report to '/tmp/dap_report.csv' CSV; */

     rollback;
....................................

-- 
aloha,
dave



More information about the clue-tech mailing list