模糊列上的TSQL分组

时间:2013-09-12 16:12:30

标签: sql sql-server tsql grouping fuzzy

我想从一张桌子中对所有商家交易进行分组,并且只是计算一下。问题是,商家,比如redbox,会有一个红盒加上添加到最后的商店编号(redbox 4562,redbox * 1234)。我还将包括用于分组目的的类别。

Category      Merchant
restaurant    bruger king 123 main st
restaurant    burger king 456 abc ave
restaurant    mc donalds * 45877d2d
restaurant    mc 'donalds *888544d
restaurant    subway 454545
travelsubway  MTA
gas station   mc donalds gas
travel        nyc taxi
travel        nyc-taxi

问题:如果商家有地址或商店位置添加到他们身份,我如何对他们进行分组。我需要的是每个商家的计数。

3 个答案:

答案 0 :(得分:4)

简短的回答是没有办法准确地做到这一点,尤其是纯粹的SQL。

你可以找到完全匹配,你可以使用LIKE运算符或(可能很大的)正则表达式系列找到通配符匹配,但你找不到类似的匹配也不能找到潜在的拼写错误。

根据您正在构建的应用程序类型,我可以考虑使用一些潜在的方法来解决此问题。

首先,规范化数据库中的商家数据。我建议反对存储确切的未经处理的字符串,例如 Bruger King 你的数据库。如果您遇到的商家与已知商家集不匹配,请询问用户是否已与您数据库中的内容匹配。当数据进入时,处理它然后将其与现有的已知商家匹配。

存储相似系数。你可能会运用像Jaccard index之类的东西来判断类似两个字符串是怎么回事。也许在剥离数字之后,这可能相当不错。至少,它可以允许您创建一个用户界面,可以尝试猜测它是什么商家。此外,一些数据库引擎具有全文索引操作符,可以描述类似于类似的内容。这些可能值得研究。

记住每位用户的商家匹配。如果用户将 bruger king 123 main st 更正为 Burger King ,则存储该关系并在将来记住它而不必提示用户。此数据还可用于帮助其他用户更正其数据。

但是如果没有用户界面怎么办?也许您正在尝试进行一些自动数据处理。如果没有某种人为干预,我真的看不到处理这个问题的方法,尽管上面介绍的一些技术可以帮助实现这一过程的自动化。我还会查看您的数据来源。也许有一个独特的商家ID可以用作关键,或者可能存在某处所有已知商家的列表(也许信用卡公司提供此API?)如果有大量数据要处理,另一种选择是使用亚马逊的Mechanical Turk等服务部分自动化它。

答案 1 :(得分:1)

您可以使用LIKE

SELECT COUNT(*) AS "COUNT", "BURGER KING" 
FROM <tables>
WHERE restaurant LIKE "%king%"

UNION ALL
SELECT COUNT(*) AS "COUNT", "JACK IN THE BOX" 
FROM <tables>
Where resturant LIKE "jack in the box%"

您可能需要根据记录的拼写方式移动通配符。

答案 2 :(得分:0)

它取决于您使用的数据库,但大多数都有某种REGEXP_INSTR或其他可用于检查模式的第一个索引的函数。然后你可以写这样的东西

SELECT SubStr(merchant, 1, REGEXP_INSTR(merchant, '[0-9]')), count('x')
  FROM Expenses
 GROUP BY SubStr(merchant, 1, REGEXP_INSTR(merchant, '[0-9]'))

这假定商家名称没有编号而商店编号没有。但是你仍然可能需要删除任何带有替换的特殊字符(如*, - 等)。