【问题标题】:Rank order ST_DWithin results by the number of radii a result appears in按结果出现的半径数对 ST_DWithin 结果进行排序
【发布时间】:2019-01-09 16:09:17
【问题描述】:

我有一张现有客户表和另一张潜在客户表。我想返回一个潜在客户列表,按他们出现的现有购买者的半径排序。

潜在客户表中每个现有客户都有很多行,并且给定现有客户周围的半径可能包含多个潜在客户。我想返回按现有客户半径计数排序的潜在客户列表。

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;

有人对如何进行有建议吗?

编辑:

在一些帮助下,我编写了这个查询,它似乎可以完成这项工作,但我现在正在验证。

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;

【问题讨论】:

  • 您添加的查询中的 CTE 使其更易于阅读。但它们不是必需的,单个 SELECT 会更快。

标签: sql postgresql aggregate postgis rank


【解决方案1】:

我想返回按现有客户半径计数排序的潜在客户列表。

您的查询尝试了与您的陈述相反的情况,即围绕现有客户计算潜在客户。
将其反转,并添加一些调整后:

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。如果是这样,请使用window function rank()。我在使用它时确定了排名,与另一个 ORDER BY 表达式打破了联系:pot.contact_id。否则,对等点以任意顺序返回,每次执行都会改变。

ORDER BY 2 是“按第二列排序”的简短语法。见:

相关:

【讨论】:

  • 我不得不将第 4 行中的 pot.nearby_customers 更改为 pur.nearby_customers,否则这似乎比我想出的效果要好得多!
  • 已相应修复。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2016-01-06
  • 2017-08-28
  • 2011-09-28
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多