按结果出现的半径数对结果进行排序 ST_DWithin
Rank order ST_DWithin results by the number of radii a result appears in
我有 table 个现有客户和另一个 table 个潜在客户。我想 return 一个潜在客户列表,按他们出现在现有购买者的半径数量排序。
每个现有客户的潜在客户 table 中有很多行,给定现有客户周围的半径可能包含多个潜在客户。我想要 return 一个潜在客户列表,这些潜在客户按他们所属的现有客户半径的数量排序。
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;
I want to return a list of potential customers ordered by the count of the existing customer radii that they fall within.
您的查询尝试了与您的陈述相反的方法,将现有客户周围的潜在客户计算在内。
反转它,并在添加一些调整后:
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
是 "order by the 2nd out column" 的缩写语法。参见:
- Select first row in each GROUP BY group?
相关:
我有 table 个现有客户和另一个 table 个潜在客户。我想 return 一个潜在客户列表,按他们出现在现有购买者的半径数量排序。
每个现有客户的潜在客户 table 中有很多行,给定现有客户周围的半径可能包含多个潜在客户。我想要 return 一个潜在客户列表,这些潜在客户按他们所属的现有客户半径的数量排序。
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;
I want to return a list of potential customers ordered by the count of the existing customer radii that they fall within.
您的查询尝试了与您的陈述相反的方法,将现有客户周围的潜在客户计算在内。
反转它,并在添加一些调整后:
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
是 "order by the 2nd out column" 的缩写语法。参见:
- Select first row in each GROUP BY group?
相关: