首页 > 解决方案 > 按地址相似但经纬度不同的 SQL 分组

问题描述

我有一个大型 Postgres 数据集表,表 ('tbl') 有 4 列,数据类似于:

ID 地址 x,y
1 22 E 4th Ave, Cordele, GA, 11015 x1,y1
2 22 E 4th Ave, Cordele, GA 11015 x2,y2
3 408 E 5th Ave, Cordele, CA 11215 x2,y2
4 408 E 5th Ave, Cordele, CA, 11215 x2,y2
5 408 E 5th Ave, 维克, VA, 11215 x2,y2
6 408 E 5th Ave, 维克, VA, 11215 x3,y3

我的问题是,如何找到所有具有相似地址的地址(相似地址意味着忽略状态和 zip 之间的逗号,这是唯一应该忽略的部分),但是具有不同的 'x,y' 值

在上面的示例中,应该返回 id 1 和 2,因为它们具有相同的地址(逗号中带有差异)但不同的 'x,y' 值。

不应返回 ID 3 和 4,因为它们的 'x,y' 值相同。

不应返回 ID 5 和 6,因为它们的地址值相同。

*我可以指望地址格式总是有一个状态和一个zip

标签: sqlpostgresqlstreet-address

解决方案


这可能有点矫枉过正,但你可以删除所有逗号并进行比较吗?

select array_agg(distinct address)
from t
group by replace(address, ',', '')
having min(x_y) <> max(x_y);

要专门删除该逗号,您可以改用:

select array_agg(distinct address)
from t
group by (case when address like '%, _____'
               then left(address, -7) || right(address, 6)
               else address
          end)
having min(x_y) <> max(x_y);

推荐阅读