【发布时间】:2019-05-02 00:29:06
【问题描述】:
我有一个带有 id、时间和 PostGIS 点对象列的表。该表包含每个 ID 在不同时间的多个点。对于同时发生的每个点,我想找到一个 ID 的点集到另一个 ID 的点集的平均距离,并找到所有其他 ID 的点集与原始 ID 集相比的平均值。
到目前为止我有这个功能:
CREATE TYPE score AS (id int, dist float);
CREATE OR REPLACE FUNCTION avgdist(id1 int) RETURNS TABLE (id int, dist float) LANGUAGE plpgsql AS
$func$
DECLARE
scores score;
id2 int;
set2 record;
begin
id2:= 0;
IF (id1 = id2 ) THEN
id2:= 1;
END IF;
FOR set2 IN
SELECT my_table.id, my_table.time, my_table.geom FROM my_table WHERE my_table.id = id2 loop
id2:= id2 + 1;
CONTINUE WHEN id1 = id2;
EXECUTE 'WITH origin AS (SELECT time, id, geom FROM my_table WHERE id = $1)
SELECT id, avg(ST_Distance(origin.geom, $2))
FROM origin WHERE origin.time = $3
group by origin.id
ORDER BY id'
INTO scores
USING id1, set2.geom, set2.time;
end loop;
RETURN;
end
$func$;
当使用select * from avgdist(2) 调用此函数时,我没有得到任何结果,与slect avgdist(2) 相同。当我在 psql 中自己的执行中运行查询并插入值时,我确实得到了结果。
我是在 sql 中创建函数的新手,所以当该表没有名称时,我真的不明白如何将分数放入返回表中。而且我似乎无法使用RETURN QUERY,因为我需要返回循环中所有查询的结果。
不胜感激,或者有没有更好的方法可以在不循环的情况下达到我想要的结果?
【问题讨论】:
标签: postgresql plpgsql sql-function