You are on page 1of 1

new 1

Saturday, 13 December 2014 1:10 PM

drop function if exists r_quantile(text,numeric);


create or replace function r_quantile(IN sqlData text, IN pVal numeric, OUT qVal numeric)
returns numeric as $$
declare
hVal numeric := 0;
hValFloor numeric := 0;
xVal numeric := 0;
xVal2 numeric := 0;
n int := 0;
begin
execute 'drop table if exists qOrdered;';
execute 'create table qOrdered (ID serial,vals numeric);';
execute 'drop table if exists qTemp;';
execute 'create table qTemp (vals1 numeric);';
execute 'insert into qTemp (' || sqlData || ');';
execute 'insert into qOrdered(vals) (select * from qTemp order by vals1 asc);';
execute 'select count(*) from qOrdered;' into n;

-- uses R-8 quantile formula


hVal := (n + 1.0/3.0)*pVal+1.0/3.0;
hValFloor := floor(hVal);
--execute 'select * from qOrdered order by vals
if pVal < 2.0/(3*n+1) then
execute 'select vals from qOrdered where ID =
elsif pVal >= (n - 1.0/3.0)/(n + 1.0/3.0) then
execute 'select vals from qOrdered where ID =
else
execute 'select vals from qOrdered where ID =
execute 'select vals from qOrdered where ID =
qVal := xVal + (hVal-hValFloor)*(xVal2-xVal);
end if;

1;' into qVal;


$1;' into qVal using n;
$1;' into xVal using hValFloor;
($1 + 1);' into xVal2 using hValFloor;

return;
end;
$$ language plpgsql;

--select * from r_quantile('select endnode from q_trials',0.9);

-1-

You might also like