Структура Postgis DB: идентичные таблицы за несколько лет? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть несколько наборов данных за разные годы в качестве шейп-файла и преобразовал их в таблицы postgres, что приводит меня к следующей ситуации:

Я получил таблицы boris2018, boris2017, boris2016 и так далее.Все они имеют одинаковую схему, а сейчас давайте сосредоточимся на следующих столбцах (пример - одна строка из таблицы boris2018).Строки представляют фактическую геометрию postgis с определенными свойствами.

 brw | brwznr |  gema   | entw | nuta
-----+--------+---------+------+------
 290 | 285034 | Sieglar | B    | W

столбец 'brwznr' является идентификатором некоторого вида, но, по-видимому, он не является полностью согласованным по всем годам для каждой геометрии.Опять же, большинство таблиц содержат дублирующую информацию.Геометрия должна быть одинаковой в каждом году, хотя это тоже не гарантируется.

Сначала я сопоставил 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));

, хотя это, очевидно, неправильно / имеет свои недостатки.Поскольку я новичок в базах данных в целом, я не могу точно сказать, является ли это проблемой запросов или структурой базы данных.

Я надеюсь, что любой может помочь, ваше время и усилия высоко ценятся!Тим

1 Ответ

0 голосов
/ 06 июня 2018

Вы пытались использовать 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.Дайте мне знать в комментариях, если это так.

...