问题描述
我是Postgresql的新手,这可能并不是实现我的结果的最佳方法,但这是我正在尝试的方法。
我有一个名为meteo
的表和另一个名为areas
的表。 meteo
具有不同站点测得的降水值,这些站点被分组为id
s所标识的区域。
areas
具有与id
中相同的meteo
,以及它们的位置/几何形状。
meteo
station precipitation area_id
1 40 1
2 60 1
3 50 2
4 30 2
区域
zone_id geom
1 "THE GEOMETRY"
2 "THE GEOMETRY"
我需要创建一个视图,汇总来自meteo
的所有具有相同id
的站点,并通过areas
加入id
并汇总这些区域的所有降水量。
除此之外,我还需要在视图中增加一列,以分类为基础告诉我每个区域的SUM降水量magnitude
。
我可以创建视图而没有多余的magnitude
列,而且我真诚地不知道如何继续。
这是我现在如何创建视图的方法:
create view my_view (area_id,precipitation,geom)
as select area_id,geom from
(select area_id,sum(precipitation) precipitation
from meteo
group by area_id) as mt,areas areas
where zone_id = mt.area_id;
然后,我创建了一个名为calculatePrecipitationMagnitude
的函数,希望在我的视图中使用该函数来计算所需的其他列。
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;
该函数似乎可以正常工作,但我只能在视图声明中使用它。
最终视图如下:
我的视图
area_id precipitaion geom magnitude
1 100 "THE GEOMETRY" level3
2 80 "THE GEOMETRY" level2
我正在使用Postgresql 10。
解决方法
考虑到两个查询都可以正常工作,您可以将视图定义写为
import uvicorn
from fastapi import FastAPI,Request
app = FastAPI()
@app.get('/')
async def nlp_email(return_method : str,user_email : str,filename : str)
return {'html': html}
,
我看不到您当前的视图如何工作。两个明显的错误是:
-
area.geom
未定义(或未引用area
表。 -
area_id
在select
中是不明确的。
对于您的问题,我建议:
create view my_view as
select m.area_id,m.precipitation,a.geom,calculatePrecipitationMagnitude(m.precipitation float4) as magnitude
from (select area_id,sum(precipitation) as precipitation
from meteo
group by area_id
) m join
areas a
on a.area_id = m.area_id;
注意:
- 第二个表应该是
areas
,而不是areas.geom
。 - 在引用多个表的查询中,所有列均应限定。在您的版本中,
area_id
中的select
不明确。 - 如果在
select
中定义了列名,则无需列出视图的列名。我更喜欢在select
中定义它们-易于维护。