Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE FUNCTION consolidate()
- RETURNS double precision AS
- $BODY$ DECLARE
- sql_amounts text;
- id integer;
- r integer;
- v_row integer[];
- amount double precision;
- v_amount double precision[];
- -- Model for the "average" values.
- v_model xy;
- date_day integer;
- date_month integer;
- result double precision;
- max_row integer;
- BEGIN
- FOR date_day, date_month IN
- SELECT
- extract( day from date '2000-01-01' + s.a ),
- extract( month from date '2000-01-01' + s.a )
- FROM
- generate_series( 0, 365, 1 ) AS s( a )
- LOOP
- -- Iterate over all the city ids.
- FOR id IN
- SELECT
- ci.id
- FROM
- city ci,
- region re,
- country co
- WHERE
- ci.region_id = re.id AND
- re.country_id = co.id AND
- co.id = 27
- ORDER BY
- co.id,
- re.id,
- ci.name
- LOOP
- sql_amounts := '
- SELECT
- row_number() OVER (ORDER BY taken)::integer,
- avg( amount )::double precision
- FROM
- city_stations( '||id||', 25 ) ca,
- measurement m
- WHERE
- m.category_id = 1 AND
- m.station_id = ca.id AND
- extract( month from m.taken ) = '||date_month||' AND
- extract( day from m.taken ) = '||date_day||'
- GROUP BY
- m.taken
- ORDER BY
- m.taken';
- v_model := NULL;
- v_row := NULL;
- v_amount := NULL;
- FOR r, amount IN
- EXECUTE sql_amounts
- LOOP
- SELECT array_append( v_row, r::integer ) INTO v_row;
- SELECT array_append( v_amount, amount::double precision ) INTO v_amount;
- END LOOP;
- max_row := array_upper( v_amount, 1 );
- IF max_row > 3 THEN
- SELECT * INTO v_model FROM plr_model_gam( v_row, v_amount );
- result := v_model.y[ max_row ];
- END IF;
- END LOOP;
- -- Iterate once while testing optimizations...
- EXIT;
- END LOOP;
- RETURN result;
- END;
- $BODY$
- LANGUAGE plpgsql VOLATILE;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement