3

我想将一张表中的所有商家交易分组,然后进行计数。问题是,商家,比方说redbox,会有一个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

问题:当商家添加了地址或商店位置时,我如何对商家进行分组。我只需要对每个商家进行计数。

4

3 回答 3

4

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

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

我可以想到一些潜在的方法来解决这个问题,具体取决于您正在构建的应用程序类型。

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

存储一个相似系数使用Jaccard 索引之类的东西来判断两个字符串的相似程度可能会有一些运气。也许在剔除数字之后,这可以很好地工作。至少,它可以让您创建一个用户界面,可以尝试猜测它是哪个商家。此外,一些数据库引擎具有全文索引运算符,可以描述类似于听起来像. 这些可能值得调查。

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

但是,如果没有 UI 怎么办?也许您正在尝试进行一些自动化数据处理。我真的认为如果没有某种人工干预就无法处理这个问题,尽管上面描述的一些技术可以帮助自动化这个过程。我也会看看你的数据来源。也许有一个不同的商家 ID 可以用作密钥,或者在某处存在所有已知商家的列表(也许信用卡公司提供此 API?)如果要处理大量数据,另一种选择是部分自动化它使用亚马逊的Mechanical Turk等服务。

于 2013-09-12T16:51:00.950 回答
1

你可以使用喜欢

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%"

您可能需要移动通配符,具体取决于记录的拼写方式。

于 2013-09-12T16:23:01.800 回答
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]'))

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

于 2013-09-12T16:28:46.360 回答