I am new to PostgreSQL and this might not really be the best way to achieve my result, but here is what i am trying.
I have a table called meteo
and another called areas
. meteo
has values of measured precipitation at different stations, and the stations are grouped into areas identified by id
s.
areas
has the same id
s found in meteo
and their positions/geometries.
meteo
station precipitation area_id 1 40 1 2 60 1 3 50 2 4 30 2
areas
zone_id geom 1 "THE GEOMETRY" 2 "THE GEOMETRY"
I need to create a view that aggregate all stations from meteo
that have the same id
, join to areas
by id
and SUM all precipitation for those areas.
Other than this, I also need an additional column in my view that tells me the magnitude
of the SUM precipitation in each area, based on a classification.
I can create the view without the extra magnitude
column, and I sincerely do not know how to move on.
Here is how I create my view for now:
create view my_view (area_id, precipitation, geom) as select area_id, precipitation, geom from (select area_id, sum(precipitation) precipitation from meteo group by area_id) as mt, areas areas where zone_id = mt.area_id;
Then, I have created a function called calculatePrecipitationMagnitude
that I would like to use in my view to calculate the additional column I need.
create or replace function calculatePrecipitationMagnitude(precipitation float4) returns text as $$ begin if abs(precipitation) >= 100 then return 'level3'; elsif abs(precipitation) >= 50 AND abs(precipitation) < 100 then return 'level2'; elsif abs(precipitation) < 50 then return 'level1'; else return 'level0'; end if; end; $$ LANGUAGE PLPGSQL;
The function seems to work fine but I am stuck in how to use it inside my view declaration.
Final view would be something like:
my_view
area_id precipitaion geom magnitude 1 100 "THE GEOMETRY" level3 2 80 "THE GEOMETRY" level2
I am using PostgreSQL 10.
Advertisement
Answer
Considering both of your queries are working fine you can write your view definition as
create view my_view as select area_id, precipitation, geom, calculatePrecipitationMagnitude(precipitation) "magnitude" from (select area_id, sum(precipitation) precipitation from meteo group by area_id) as mt, areas.geom where areas.area_id = mt.area_id;