【问题标题】:SQL group by similar address but different longitude and latitude按地址相似但经纬度不同的 SQL 分组
【发布时间】:2021-03-16 20:56:37
【问题描述】:

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

ID address 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, vic, VA, 11215 x2,y2
6 408 E 5th Ave, vic, VA, 11215 x3,y3

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

在上面的例子中,id 1 和 2 应该被返回,因为它们有相同的地址(用逗号区分)但是不同的 'x,y' 值。

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

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

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

【问题讨论】:

    标签: sql postgresql street-address


    【解决方案1】:

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

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

    【讨论】:

    • CASE 表达式不需要ELSE address吗?
    • @MatBailie 。 . .谢谢。
    【解决方案2】:

    我不确定您的数据有多少变化,但我能够从提供的示例数据中获得您想要的结果。我将数据插入到名为 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 );
    

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多