2012-06-06 6 views
0

Я новичок в PostgreSQL, так что несите меня.Почему я не могу добавить одно значение ко всему столбцу PostgreSQL PostGIS?

У меня есть две таблицы, одна из которых называется «polys» с несколькими полигонами, а другая называется «ящик», которая содержит только один многоугольник (моя ограничивающая рамка). Мой запрос выбирает все полигоны в «polys», которые попадают в рамку «box». Это клип, если хотите. Обе таблицы имеют два столбца, один из которых содержит их идентификаторы, а другой - их GeoJSON, называемый «the_geom».

Что я хочу - это один столбец, содержащий идентификаторы полигонов, которые попадают в ограничительную рамку, другой столбец с GeoJSON с этими многоугольниками, называемый «the_geom_webmercator», другой называется «polygonarea» с каждой областью полигона, а затем другой столбец «totalarea» ", который содержит ТО ЖЕ ТОЧНОЕ ЗНАЧЕНИЕ для каждого многоугольника (значение представляет собой сумму всех полигонов). Однако просто запрос SUM не будет работать, так как это возвращает только 1 значение. Вместо этого я хочу, чтобы это значение заполнило весь столбец. Ниже я попытался; «SUM ... AS» - это часть, о которой идет речь.

SELECT polys.id, ST_Transform(ST_Intersection(polys.the_geom, box.the_geom),3857) 
AS the_geom_webmercator, 
ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857)) 
AS polygonarea, 
SUM(ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857))) 
AS totalarea FROM polys,box 

ответ

2

Если вы используете агрегированную функцию SUM(), вам также нужен оператор GROUP BY.

Я предполагаю, что вы хотите это окно Функция

http://www.postgresql.org/docs/9.1/static/tutorial-window.html

С оконной функции можно вычислить агрегаты для отдельных строк без GROUP BY.

SELECT 
polys.id, 
ST_Transform(ST_Intersection(polys.the_geom, box.the_geom),3857) AS the_geom_webmercator, 
ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857)) AS polygonarea, 
SUM(ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857))) OVER() AS totalarea 
FROM polys,box 
+0

Работает с предлагаемым кодом. Большое спасибо. – John

Смежные вопросы