SQL 分组按地址相似但经纬度不同

问题描述

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

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

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

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

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

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

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

解决方法

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

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);
,

我不确定您的数据中有多少变化,但我能够从提供的示例数据中得到您想要的。我将数据插入到名为 locdat 的表中,您可以根据需要更改列和表。

SELECT
    id,address,xy
FROM
    (
        SELECT
            l.*,COUNT(l.address)
            OVER(PARTITION BY replace(l.address,''))             AS addr_count,COUNT(l.xy)
            OVER(PARTITION BY replace(l.address,''),l.xy)       AS xy_count
        FROM
            locdat l
    )
WHERE
    ( addr_count >= 1
      AND xy_count < 2 );