我对编写查询很陌生,在这方面花了很多时间。我已经走得很远了,但我仍坚持最终的目标。
我需要一个Postgresql查询,它将使用最近的日期检索给定客户的站点/位置列表,每个站点都有纬度/经度信息。我需要确定客户的站点总数。问题是,从技术上讲,客户可能使用同一个站点,但他们将其拆分为多个命名站点(例如,站点1北、站点1南、站点1东、站点1西等)。在该示例中,只有1个站点,而不是4个站点。
最终目标是识别列表中位于相同1.5英里圆/半径内的所有站点,并为这些站点分配相同的final_cluster_id。这样,我可以很快看到所有具有相同final_cluster_id的站点之间的距离都在1.5英里以内。对于距离自己1.5英里内没有其他站点的任何站点,我希望final_cluster_id是“独立的”
为了验证,我可以选择一个随机的final_cluster_id(例如5),用该id标识每个站点,在地图上绘制每个站点的坐标,我会发现它们都在一个1.5英里的圆圈内。
这是我到目前为止的情况。除了正确的final_cluster_ids,我正在获取所有内容。我们非常感谢您的帮助:
WITH s_with_img AS ( SELECT s.id, s.name, s.center_lat, s.center_lng, images.captured_at, s.customer_id FROM sites s JOIN images ON s.id = images.site_id WHERE s.customer_id = 8 ), recent_img AS ( SELECT id, MAX(captured_at) AS recent_captured_at FROM s_with_img GROUP BY id ) SELECT s.*, ( SELECT COUNT(*) + 1 FROM s_with_img s2 WHERE s2.center_lat BETWEEN s.center_lat - 0.009 and s.center_lat + 0.009 AND s2.center_lng BETWEEN s.center_lng - 0.009 and s.center_lng + 0.009 AND s2.id != s.id ) AS final_cluster_id FROM s_with_img s JOIN recent_img ri ON s.id = ri.id AND s.captured_at = ri.recent_captured_at ORDER by captured_at desc;