Postgis DB 结构:多年相同的表?
Postgis DB Structure: Identical tables for multiple years?
我有多个不同年份的数据集作为 shapefile,并将它们转换为 postgres tables,这让我面临以下情况:
我得到了 tables boris2018、boris2017、boris2016 等等。
它们都共享一个相同的模式,现在让我们关注以下列(示例是 boris2018 table 中的一行)。这些行代表具有某些属性的实际 postgis 几何体。
brw | brwznr | gema | entw | nuta
-----+--------+---------+------+------
290 | 285034 | Sieglar | B | W
'brwznr' 列是某种 ID,但对于每个几何图形,它似乎在所有年份中都不是完全一致的。
再者,大多数 table 包含重复信息。几何形状 应该 每年都相同,尽管这也不能保证。
我首先做的是将每年的 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));
虽然这显然wrong/has它的不足。
由于我是一般的数据库新手,所以我无法真正判断这是查询问题还是数据库结构问题。
我希望任何人都能提供帮助,非常感谢您付出的时间和精力!
蒂姆
您尝试过使用 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
。请注意,在处理非常大的 table 时,这种方法可能不是最快的方法。如果是这种情况,请考虑将这三个查询的结果合并到另一个 table 并使用 geom
字段创建索引。如果是这种情况,请在评论中告诉我。
我有多个不同年份的数据集作为 shapefile,并将它们转换为 postgres tables,这让我面临以下情况:
我得到了 tables boris2018、boris2017、boris2016 等等。 它们都共享一个相同的模式,现在让我们关注以下列(示例是 boris2018 table 中的一行)。这些行代表具有某些属性的实际 postgis 几何体。
brw | brwznr | gema | entw | nuta
-----+--------+---------+------+------
290 | 285034 | Sieglar | B | W
'brwznr' 列是某种 ID,但对于每个几何图形,它似乎在所有年份中都不是完全一致的。 再者,大多数 table 包含重复信息。几何形状 应该 每年都相同,尽管这也不能保证。
我首先做的是将每年的 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));
虽然这显然wrong/has它的不足。 由于我是一般的数据库新手,所以我无法真正判断这是查询问题还是数据库结构问题。
我希望任何人都能提供帮助,非常感谢您付出的时间和精力! 蒂姆
您尝试过使用 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
。请注意,在处理非常大的 table 时,这种方法可能不是最快的方法。如果是这种情况,请考虑将这三个查询的结果合并到另一个 table 并使用 geom
字段创建索引。如果是这种情况,请在评论中告诉我。