Thread: using Avg()

using Avg()

From
"Mark Connelly@South Central"
Date:
I have a table with a column named SwErr   (Switch Error) with int values
date with datetime values and SwID with char(3)
I am trying to get a subset back where the folowing is true
select the avg(SwErr) for the last 30 days where SwId = 'XX1'
Select the value of todays value of SwErr where SwId = 'XX1'
if todays value of SwErr is greater than 4 times the SwErr Average return in
the value
TIA
Mark Connelly


The contents of this email and any attachments are sent for the personal attention
of the addressee(s) only and may be confidential.  If you are not the intended
addressee, any use, disclosure or copying of this email and any attachments is
unauthorised - please notify the sender by return and delete the message.  Any
representations or commitments expressed in this email are subject to contract. 
ntl Group Limited



Re: using Avg()

From
Christoph Haller
Date:
>
> I have a table with a column named SwErr   (Switch Error) with int
values
> date with datetime values and SwID with char(3)
> I am trying to get a subset back where the folowing is true
>
> select the avg(SwErr) for the last 30 days where SwId = 'XX1'
> Select the value of todays value of SwErr where SwId = 'XX1'
> if todays value of SwErr is greater than 4 times the SwErr Average
return in
> the value
>
Looks like you could use a plpgsql function, something like (untested)

CREATE OR REPLACE FUNCTION
get_dated_SwErr(CHAR) RETURNS INTEGER AS '
DECLAREthisSwID       ALIAS FOR $1;todaysSwErr    INT;avgSwErr       INT;avg4SwErr      INT;dateLimit      TIMESTAMP;
BEGIN

SELECT INTO dateLimit current_date - ''30 days''::interval ;

SELECT INTO todaysSwErr SwErr FROM <SwTable>WHERE SwID = thisSwID AND SwDate = current_date ;

SELECT INTO avgSwErr AVG(SwErr)::int FROM <SwTable>WHERE SwID = thisSwID AND SwDate BETWEEN current_date AND dateLimit
;

avg4SwErr := avgSwErr * 4 ;

IF todaysSwErr > avg4SwErr THENRETURN todaysSwErr;
ELSERETURN avgSwErr;
END IF;

END;
' LANGUAGE 'plpgsql' ;

then
SELECT SwID, get_dated_SwErr(SwID) FROM <SwTable>WHERE SwID = 'XX1' AND SwDate = current_date ;
should bring up the result.

Regards, Christoph