问题描述
我有一个很大的 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 );