Группировка по похожим символьным строкам — Transact SQL

У меня есть скрипт ранжирования, который работает просто отлично, в то время как он ранжирует 30 лучших продуктов, которые продаются месяц за месяцем, но за последние несколько месяцев мои данные немного изменились. Итак, название продукта произошло от:

    product_name 

to

   product_name@

где @ — это какой-то специальный символ. Обратите внимание, что специальный символ не всегда представляет собой только один символ, иногда между специальным символом и именем есть пробел. Кроме того, название продукта не всегда заканчивается буквой, иногда оно заканчивается цифрой. Эта странность в данных, по-видимому, происходит случайно и с разными названиями продуктов. У меня более 50 000 товаров в этой таблице. Есть ли способ, которым я все еще могу группировать по продукту? Или, возможно, обрезать специальный символ?


person windsormatic    schedule 07.07.2016    source источник
comment
Вам лучше разобраться с данными. Если нет, взгляните на функцию SOUNDEX stackoverflow.com/questions/37744220/sql-аналогичные данные в столбце/   -  person Rich Benner    schedule 07.07.2016
comment
Могут ли какие-либо из этих специальных символов появляться в самом названии продукта? У вас есть полный список этих персонажей?   -  person PM 77-1    schedule 07.07.2016
comment
Это почти всегда авторское право, торговая марка или зарезервированный символ. Эти символы иногда находятся внутри самого названия продукта, но исторически они были там, поэтому они не вызывают никаких проблем.   -  person windsormatic    schedule 07.07.2016


Ответы (1)


Если это конечные символы, взгляните на это решение:

SELECT RTRIM(SUBSTRING(Name, 1, CASE WHEN PATINDEX('%[$#@]%', Name)!=0 THEN PATINDEX('%[$#@]%', Name)-1 ELSE LEN(Name) END)) Word, COUNT(*) Total
FROM (VALUES
    ('Cat $#@'),
    ('Cat $'),
    ('Dog'),
    ('Dog$'),
    ('Cat'),
    ('Cat ')) T(Name)
GROUP BY RTRIM(SUBSTRING(Name, 1, CASE WHEN PATINDEX('%[$#@]%', Name)!=0 THEN PATINDEX('%[$#@]%', Name)-1 ELSE LEN(Name) END))

Слова обрезаются любым специальным символом в скобках [$#@] и RTобрезаются для удаления ненужных пробелов.

person Paweł Dyl    schedule 12.07.2016