У меня сложная проблема. Я пытаюсь создать таблицу, в которой перечислены все люди из таблицы 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 миль?
Я ожидал, что будут дубликаты, так как радиус, который я устанавливаю, может перекрываться, поэтому я думал, что ИСКЛЮЧЕНИЕ решит эту проблему. Но результат в том, что мой общий счет короток.
Может кто-нибудь помочь мне с моей логикой?