Порядок ранга ST_DПо результатам по количеству радиусов, в которых появляется результат - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица существующих клиентов и еще одна таблица потенциальных клиентов. Я хочу вернуть список потенциальных клиентов, упорядоченный по количеству радиусов существующих покупателей, в которых они появляются.

Существует много строк в таблице потенциальных клиентов для каждого существующего клиента, и радиус вокруг данного существующего клиента может охватывать несколько потенциальных клиентов. Я хочу вернуть список потенциальных клиентов, упорядоченных по количеству существующих радиусов клиентов, к которым они относятся.

SELECT pur.contact_id AS purchaser, count(pot.*) AS nearby_potential_customers 
FROM purchasers_geocoded pur, potential_customers_geocoded pot 
WHERE ST_DWithin(pur.geom,pot.geom,1000)
GROUP BY purchaser;

У кого-нибудь есть совет, как поступить?

EDIT:

С некоторой помощью я написал этот запрос, который, похоже, выполняет свою работу, но сейчас я проверяю.

WITH prequalified_leads_table AS (
   SELECT *
   FROM nearby_potential_customers
   WHERE market_val > 80000
   AND   market_val < 120000
   )
, proximate_to_existing AS (
   SELECT pot.prop_id AS prequalified_leads
   FROM purchasers_geocoded pur, prequalified_leads_table pot
   WHERE ST_DWithin(pot.geom,pur.geom,100)
  )
SELECT prequalified_leads, count(prequalified_leads)
FROM proximate_to_existing
GROUP BY prequalified_leads
ORDER BY count(*) DESC;

1 Ответ

0 голосов
/ 10 января 2019

Я хочу вернуть список потенциальных клиентов, упорядоченных по количеству существующих радиусов клиентов, в которые они попадают.

Ваш запрос оказался противоположным вашему утверждению, подсчитав потенциальных клиентов вокруг уже существующих.
Инвертирование, и после добавления некоторых настроек:

SELECT pot.contact_id AS potential_customer
     , rank() OVER (ORDER BY pur.nearby_customers DESC
                           , pot.contact_id) AS rnk
     , pur.nearby_customers 
FROM   potential_customers_geocoded pot
LEFT   JOIN LATERAL (
   SELECT count(*) AS nearby_customers 
   FROM   purchasers_geocoded pur
   WHERE  ST_DWithin(pur.geom, pot.geom, 1000)
   ) pur ON true
ORDER  BY 2;

Я предлагаю подзапрос с LEFT JOIN LATERAL ... ON true для подсчета. Следует использовать пространственный индекс, который у вас, несомненно, есть:

CREATE INDEX ON purchasers_geocoded USING gist (geom);

Таким образом, в результате сохраняются строки с 0 соседними клиентами - ваш первоначальный стиль объединения исключает их. Связанный:

Затем ORDER BY результирующий nearby_customers во внешнем запросе (не: nearby_potential_customers).

Не ясно, хотите ли вы добавить фактический rank. Используйте оконную функцию rank(), если это так. Я сделал ранг детерминированным, разрывая связи с дополнительным выражением ORDER BY: pot.contact_id. В противном случае одноранговые узлы возвращаются в произвольном порядке, который может меняться при каждом выполнении.

ORDER BY 2 - короткий синтаксис для «порядка по второму столбцу». См:

Связанный:

...