Advertisement
Guest User

Untitled

a guest
May 29th, 2011
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION consolidate()
  2.   RETURNS double precision AS
  3. $BODY$ DECLARE
  4.   sql_amounts text;
  5.   id integer;
  6.  
  7.   r integer;
  8.   v_row integer[];
  9.  
  10.   amount double precision;
  11.   v_amount double precision[];
  12.  
  13.   -- Model for the "average" values.
  14.   v_model xy;
  15.  
  16.   date_day integer;
  17.   date_month integer;
  18.  
  19.   result double precision;
  20.   max_row integer;
  21. BEGIN
  22.   FOR date_day, date_month IN
  23.     SELECT
  24.       extract( day from date '2000-01-01' + s.a ),
  25.       extract( month from date '2000-01-01' + s.a )
  26.     FROM
  27.       generate_series( 0, 365, 1 ) AS s( a )
  28.   LOOP
  29.  
  30.   -- Iterate over all the city ids.
  31.   FOR id IN
  32.     SELECT
  33.       ci.id
  34.     FROM
  35.       city ci,
  36.       region re,
  37.       country co
  38.     WHERE
  39.       ci.region_id = re.id AND
  40.       re.country_id = co.id AND
  41.       co.id = 27
  42.     ORDER BY
  43.       co.id,
  44.       re.id,
  45.       ci.name
  46.   LOOP
  47.     sql_amounts := '
  48.      SELECT
  49.        row_number() OVER (ORDER BY taken)::integer,
  50.        avg( amount )::double precision
  51.      FROM
  52.        city_stations( '||id||', 25 ) ca,
  53.        measurement m
  54.      WHERE
  55.        m.category_id = 1 AND
  56.        m.station_id = ca.id AND
  57.        extract( month from m.taken ) = '||date_month||' AND
  58.        extract( day from m.taken ) = '||date_day||'
  59.      GROUP BY
  60.        m.taken
  61.      ORDER BY
  62.        m.taken';
  63.  
  64.     v_model := NULL;
  65.     v_row := NULL;
  66.     v_amount := NULL;
  67.  
  68.     FOR r, amount IN
  69.       EXECUTE sql_amounts
  70.     LOOP
  71.       SELECT array_append( v_row, r::integer ) INTO v_row;
  72.       SELECT array_append( v_amount, amount::double precision ) INTO v_amount;
  73.     END LOOP;
  74.  
  75.     max_row := array_upper( v_amount, 1 );
  76.  
  77.     IF max_row > 3 THEN
  78.       SELECT * INTO v_model FROM plr_model_gam( v_row, v_amount );
  79.       result := v_model.y[ max_row ];
  80.     END IF;
  81.   END LOOP;
  82.  
  83.   -- Iterate once while testing optimizations...
  84.   EXIT;
  85.   END LOOP;
  86.  
  87.   RETURN result;
  88. END;
  89. $BODY$
  90.   LANGUAGE plpgsql VOLATILE;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement