2013-09-12 4 views
3

Я хотел бы сгруппировать все транзакции продавца из одной таблицы и просто получить счет. Проблема в том, что купец, скажем, redbox, будет иметь redbox плюс добавленный номер магазина (redbox 4562, redbox * 1234). Я также буду включать категорию для группировки.TSQL-группировка на нечеткой колонке

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 

Вопрос: Как я могу группа торговцы, когда они адрес или магазин место добавлены в them.All мне нужно, это счетчик для каждого торговца.

+0

мне нужен подсчет для все коммерсанта не только один купец, так как «% король%» не будет работать – Mani007

+0

выход должен выглядеть следующим образом: торговец Количество категория bruger король 2 ресторан метро 1 ресторан метро 1 путешествие mc donalds 2 ресторан mc donalds 1 заправочная станция – Mani007

ответ

4

Короткий ответ: нет способа точно сделать это, особенно с помощью только чистого SQL.

Вы можете найти точные совпадения, и вы можете найти шаблон подстановки, совпадающую с помощью LIKE оператора или (потенциально огромной) серии регулярных выражений, но вы не можете найти подобные матчей не может найти потенциальные опечатки матчей.

Существует несколько потенциальных подходов, которые я могу придумать для решения этой проблемы, в зависимости от того, какой тип приложения вы строите.

Во-первых, нормализуйте данные продавца в базе данных. Я бы порекомендовал против хранения точной, необработанной строки, такой как Bruger King в вашей базе. Если вы сталкиваетесь с продавцом, который не соответствует известному набору продавцов, спросите пользователя, совпадает ли он с чем-то в вашей базе данных. Когда данные поступают, обрабатывайте их и сопоставляйте с существующим известным продавцом.

Хранить коэффициент подобия. Возможно, вам повезло, используя что-то вроде Jaccard index, чтобы судить, как аналогично две строки. Возможно, после удаления цифр это может работать довольно хорошо. По крайней мере, это может позволить вам создать пользовательский интерфейс, который может попытаться угадать, какой он есть. Кроме того, некоторые двигатели базы данных имеют полнотекстовые индексирующие операторы, которые могут распознавать такие вещи, как , похожие на или звучит как. Это потенциально может стоить исследовать.

Запомните торговые матчи для одного пользователя. Если пользователь исправляет bruger king 123 main st до Burger King, сохраните это отношение и запомните его в будущем, не запрашивая у пользователя. Эти данные также могут использоваться, чтобы помочь другим пользователям исправить свои данные.

Но что делать, если нет пользовательского интерфейса? Возможно, вы пытаетесь выполнить автоматическую обработку данных. Я действительно не вижу возможности справиться с этим без какого-либо вмешательства человека, хотя некоторые из описанных выше методов могут помочь автоматизировать этот процесс. Я также посмотрю на источник ваших данных. Возможно, есть отдельный идентификатор продавца, который вы можете использовать в качестве ключа, или, может быть, существует где-то список всех известных торговцев (возможно, компании кредитных карт предоставляют этот API?) Если есть лодку с нагрузкой данных для обработки, другой вариант был бы частично автоматизировать его с помощью службы, такой как Amazon's Mechanical Turk.

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

Вы, возможно, придется переместить символы вокруг в зависимости от того, как записи были прописаны.

+1

Это не будет соответствовать 'bruger king 123 main st'. –

+0

Даже не заметил, что хороший улов! – Sewder

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]')) 

Это предполагает, что имя коммерсанта не имеет номера и номер магазин делает. Однако вам все равно придется выделять любые специальные символы с заменой (например, *, - и т. Д.).

+0

T-SQL не имеет встроенной поддержки регулярных выражений. –

Смежные вопросы