我有多个不同年份的数据集作为 shapefile,并将它们转换为 postgres 表,这让我面临以下情况:
我有表 boris2018、boris2017、boris2016 等等。 它们都共享相同的模式,现在让我们关注以下列(示例是 boris2018 表中的一行)。这些行代表具有某些属性的实际 postgis 几何体。
brw | brwznr | gema | entw | nuta
-----+--------+---------+------+------
290 | 285034 | Sieglar | B | W
'brwznr' 列是某种 ID,但对于每个几何图形,它似乎在所有年份中都不是完全一致的。 再者,大多数表都包含重复信息。每年的几何结构应该相同,但也不能保证这一点。
我首先做的是将每年的 brwznr 与 2018 年的数据进行匹配,将 brw17、brw2016、...列添加到我的 boris2018 数据中,如下所示:
brw18 | brw17 | brw16 | brwznr | gema | entw | nuta
-------+-------+-------+--------+---------+------+------
290 | 260 | 250 | 285034 | Sieglar | B | W
这导致一些数据丢失(因为没有找到匹配的 brwznr),一些数据错误匹配(因为一些匹配由于数据不一致而错误)并且感觉不对.
我真正想要实现的是进行快速查询,让我获得特定坐标的不同 brw 值,大约是
SELECT ortst, brw, gema, gena
FROM boris2018, boris2017, boris2016
WHERE ST_Intersects(geom,ST_SetSRID(ST_Point(7.130577, 50.80292),4326));
或
SELECT ortst, brw18, brw17, brw16, gema, gena
FROM boris
WHERE ST_Intersects(geom,ST_SetSRID(ST_Point(7.130577, 50.80292),4326));
虽然这显然是错误的/有其缺陷。 由于我是一般的数据库新手,所以我无法真正判断这是查询问题还是数据库结构问题。
我希望任何人都可以提供帮助,非常感谢您的时间和精力! 蒂姆
最佳答案
您是否尝试过使用 CTE
?
WITH j AS (
SELECT ortst, brw, gema, gena FROM boris2016
UNION
SELECT ortst, brw, gema, gena FROM boris2017
UNION
SELECT ortst, brw, gema, gena FROM boris2018)
SELECT * FROM j
WHERE ST_Intersects(j.geom,ST_SetSRID(ST_Point(7.130577, 50.80292),4326));
根据您的需要,您可能想使用 UNION ALL
.请注意,在处理非常大的表时,这种方法可能不是最快的方法。如果是这种情况,请考虑将这三个查询的结果合并到另一个表中,并使用 geom
字段创建索引。如果是这种情况,请在评论中告诉我。
关于postgresql - Postgis 数据库结构 : Identical tables for multiple years?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50715472/