Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将条件语句的结果传递给另一个SQL语句?_Sql_Postgresql_Conditional Statements_Case_Postgis - Fatal编程技术网

如何将条件语句的结果传递给另一个SQL语句?

如何将条件语句的结果传递给另一个SQL语句?,sql,postgresql,conditional-statements,case,postgis,Sql,Postgresql,Conditional Statements,Case,Postgis,以下SQL使用PostgreSQL中的PostGIS扩展执行以下工作流: 为本例制作一些多边形示例 在每个多边形中创建1000个随机点 将每个多边形中的随机点聚类为4个簇 我想添加一个条件语句,以便每个多边形的面积决定要生成多少簇,而不是每个多边形的固定数量 以下是一条条件语句,它根据面积确定簇的数量: --Conditional statement SELECT poly_id, CASE WHEN ST_Area(geom) > 9 THEN 1 ELS

以下SQL使用PostgreSQL中的PostGIS扩展执行以下工作流:

  • 为本例制作一些多边形示例
  • 在每个多边形中创建1000个随机点
  • 将每个多边形中的随机点聚类为4个簇
  • 我想添加一个条件语句,以便每个多边形的面积决定要生成多少簇,而不是每个多边形的固定数量

    以下是一条条件语句,它根据面积确定簇的数量:

    --Conditional statement
    SELECT poly_id,
        CASE
          WHEN ST_Area(geom) > 9 THEN 1
          ELSE 0
        END
      FROM polys;
    
    如何将此条件语句集成到应用集群的SQL语句中?最终结果应该是多边形,每个多边形的簇数由多边形区域决定


    包含示例数据的完整SQL代码

    -- Make up some data
    CREATE TABLE polys(poly_id, geom) AS (
            VALUES  (1, 'POLYGON((1 1, 1 5, 4 5, 4 4, 2 4, 2 2, 4 2, 4 1, 1 1))'::GEOMETRY),
                    (2, 'POLYGON((6 6, 6 10, 8 10, 9 7, 8 6, 6 6))'::GEOMETRY)
        );
    
    -- Create point clusters within each polygon
    CREATE TABLE pnt_clusters AS
      SELECT  polys.poly_id,
              ST_ClusterKMeans(pts.geom, 4) OVER(PARTITION BY polys.poly_id) AS cluster_id,
              pts.geom
      FROM    polys,
              LATERAL ST_Dump(ST_GeneratePoints(polys.geom, 1000, 1)) AS pts
    ;
    

    编辑:

    尝试组合SQL语句时,出现以下错误:

    ERROR:  syntax error at or near "AS"
    LINE 4: ...ans(pts.geom, 8) OVER(PARTITION BY polys.poly_id) AS cluster...
    


    请参阅对语法错误的更正:

    -- Create point clusters within each polygon
    CREATE TABLE pnt_clusters3 AS
      SELECT  polys.poly_id,
          CASE
              WHEN ST_Area(polys.geom) >9 THEN ST_ClusterKMeans(pts.geom, 8) OVER(PARTITION BY polys.poly_id) 
              
              ELSE ST_ClusterKMeans(pts.geom, 2) OVER(PARTITION BY polys.poly_id) 
             
          END AS cluster_id,
            pts.geom
      FROM    polys,
              LATERAL ST_Dump(ST_GeneratePoints(polys.geom, 1000, 1)) AS pts
    ;
    
    

    请参阅对语法错误的更正:

    -- Create point clusters within each polygon
    CREATE TABLE pnt_clusters3 AS
      SELECT  polys.poly_id,
          CASE
              WHEN ST_Area(polys.geom) >9 THEN ST_ClusterKMeans(pts.geom, 8) OVER(PARTITION BY polys.poly_id) 
              
              ELSE ST_ClusterKMeans(pts.geom, 2) OVER(PARTITION BY polys.poly_id) 
             
          END AS cluster_id,
            pts.geom
      FROM    polys,
              LATERAL ST_Dump(ST_GeneratePoints(polys.geom, 1000, 1)) AS pts
    ;
    
    

    如果我理解,如果ST_面积(geom)>9,您希望将“、4”替换为1,否则为2。我说的对吗?@AndreaTaroni86是的,没错。如果我理解,如果ST_Area(geom)>9,您希望将“、4”替换为1,否则为2。“我说得对吗?”安德烈·阿塔罗尼亚86是的,没错。我很感激你的回答。本节产生以下错误:
    错误:列引用“geom”不明确第4行:当ST_Area(geom)>9时,ST_ClusterKMeans(pts.ge…
    @Borealis我已更新了答案。很高兴您能找到答案。我感谢您的回答。本节产生以下错误:
    错误:列引用“geom”第4行不明确:当ST_Area(geom)>9时,ST_ClusterKMeans(pts.ge…
    @Borealis我已经更新了答案。很高兴你能找到答案