PostgreSQL-使用按汇总分组作为输入以在视图中创建附加列的功能

问题描述

我是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_idselect中是不明确的。

对于您的问题,我建议:

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中定义它们-易于维护。