【问题标题】:SQL group by LIKE patternLIKE 模式的 SQL 组
【发布时间】:2010-01-07 09:09:53
【问题描述】:

我有下表: 我想做的是组: 对此类数据按firstnameaddress 分组

| firstname | address
+-----------+----------
| alex      | 338 s. michigan 
| mark      | finger
| alex      | 338 south michigan
| ted       | port

但是 group by 不会返回address 字段的相似值。

是否有我可以应用于组的模式?我想使用 LIKE 模式系统。例如:

select firstname, address from t group by firstname, '%'+SUBSTRING(address,0,5)+'%' 

但该查询似乎不起作用。

有什么想法吗?谢谢!

【问题讨论】:

    标签: sql group-by


    【解决方案1】:

    如果子字符串可以出现在另一个地址的任何位置,你可以像这样进行连接:

    select a.id, a.addr, b.id as b_id, b.addr as b_addr from t a, t b where
        b.addr like concat('%', substr(a.addr, 0, 5), '%') and
        b.id <> a.id;
    

    将返回前 5 个地址字符出现在另一个地址内的所有记录。

    或者你可以忽略 char 5 之后的内容:

    select firstname, substr(addr, 0, 5) from t group by firstname,
      substr(addr, 0, 5);
    

    您可能想使用一种工具来规范化邮政地址,例如:

    https://webgis.usc.edu/Services/AddressNormalization/Default.aspx
    

    (最多可释放 2500 条记录)

    【讨论】:

      【解决方案2】:

      如果您也想按地址的前 5 个字符进行分组,您可以这样做:

      select firstname, MAX(address) AS Address
      from t 
      group by firstname, SUBSTRING(address,0,5)
      

      这是你想要的吗?

      【讨论】:

      • 不是真的,我想使用 LIKE 模式,这样我就可以在更广泛的范围内进行过滤。
      猜你喜欢
      • 2015-09-27
      • 2011-11-02
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2010-11-21
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多