Как получить взаимоисключающие результаты при установке диапазона ST_DISTANCE на postgresql - PullRequest
0 голосов
/ 12 марта 2019

У меня сложная проблема. Я пытаюсь создать таблицу, в которой перечислены все люди из таблицы 1 («человек»), у которых есть по крайней мере 3 человека («соседние люди») из таблицы 2, живущих на расстоянии <0,25 миль от нас, и </p>

другой стол с «человеком», у которого есть по крайней мере 3 человека поблизости, живущих на расстоянии от .25 до .50 от них. Эти две группы должны быть взаимоисключающими, не перекрывать друг друга.

Сначала я выполнил запрос, чтобы выяснить общее количество «людей», у которых по крайней мере три «соседних человека» живут менее чем в .50 миле. В запросе я использую метры вместо миль. 804 м = .50 миль

select count(*) from ( select person, (select count(*) from table2 where ST_Distance(table1.geom::geography, table2.geom::geography) < 804) as nearby_people from table1) alias where nearby_people > 3 DESC) total_count;

Я получил COUNT = 5793

Затем я запустил запрос для <.25 и получил COUNT = 738. </p>

select count(*) from ( select column1, column2, (select count(*) from table2 where ST_Distance(table1.geom::geography, table2.geom::geography) < 402) as people_nearby from table1) alias where nearby_people > 3 DESC) total_count;

Поэтому, когда я запускаю запрос для людей, чьи близлежащие люди живут на расстоянии от 0,25 до 0,50 миль, я ожидаю получить 5055 но вместо этого я получаю COUNT = 3719

select count(*) from ( select column1, column2, (select count(*) from table2 where ST_Distance(table1.geom::geography, table2.geom::geography) between 402 and 804) as people_nearby from table1) alias where nearby_people > 3 DESC) total_count;

Числа не складываются.

Я также попытался выполнить запрос для подсчета ближайших людей <.50 миль и использовал EXCEPT, чтобы убрать результаты, которые появляются через <.25 миль </p>

select count(*) from ( (select column1, column2, (select count(*) from table2 where ST_Distance(table1.geom::geography, table2.geom::geography) < 804) as people_nearby from table1) alias where nearby_people > 3 ) EXCEPT (select column1, column2, (select count(*) from table2 where ST_Distance(table1.geom::geography, table2.geom::geography) < 402) as people_nearby from table1) alias where nearby_people > 3 ) )total_count;

но я получаю свой первоначальный счет = 5793

Я отменил запрос и запустил

<.25 EXCEPT <.50

и получил COUNT = 738

Мой вопрос Как я могу выбрать две взаимоисключающие группы? Если есть 5793 «человека» с как минимум 3 близлежащими людьми, живущими на расстоянии менее .50 миль, как я могу отделить «людей» от ближайших людей, живущих на расстоянии <.25 </p>

от

«люди», у которых есть люди, находящиеся поблизости от .25 до .50 миль?

Я ожидал, что будут дубликаты, так как радиус, который я устанавливаю, может перекрываться, поэтому я думал, что ИСКЛЮЧЕНИЕ решит эту проблему. Но результат в том, что мой общий счет короток.

Может кто-нибудь помочь мне с моей логикой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...