Этот вопрос задавался несколько раз, но я не могу найти конкретный ответ, который мне нужен. У меня есть запрос, который находит наиболее часто встречающиеся слова в столбце в SQL Server и перечисляет их по количеству их появлений. Проблема в том, что если слово появляется несколько раз подряд, оно считается один раз для каждого появления. Я хотел бы считать каждое слово только один раз в строке.
Таким образом, строка со значением «Быть или не быть» будет считаться «до» и «Быть» один раз каждый, а не дважды каждый для целей общей частоты.
Вот текущий запрос, который также удаляет общие слова, такие как местоимения, и заменяет все часто встречающиеся разделители пробелами. Он немного староват, поэтому я подозреваю, что он может быть намного аккуратнее.
SELECT sep.Col Phrase, count(*) as Qty
FROM (
Select * FROM (
Select value = Upper(RTrim(LTrim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Title, ',', ' '), '.', ' '), '!', ' '), '+', ' '), ':', ' '), '-', ' '), ';', ' '), '(', ' '), ')', ' '), '/', ' '), '&', ''), '?', ' '), ' ', ' '), ' ', ' '))))
FROM Table
) easyValues
Where value <> ''
) actualValues
Cross Apply dbo.SeparateValues(value, ' ') sep
WHERE sep.Col not in ('', 'THE', 'A', 'AN', 'WHO', 'BOOK', 'AND', 'FOR', 'ON', 'HAVE', 'YOUR', 'HOW', 'WE', 'IN', 'I', 'IT', 'BY', 'SO', 'THEIR', 'IS', 'OR', 'HE', 'OF', 'WHAT'
, 'HIM', 'HIS', 'SHE', 'HER', 'MY', 'FROM', 'US', 'OUR', 'AT', 'ALL', 'BE', 'OF', 'TO', 'YOU', 'WITH', 'THAT', 'THIS', 'WAS', 'ARE', 'THERE', 'BUT', 'HAS'
, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'WILL', 'MORE', 'DIV', 'THAN', 'EACH', 'GET', 'ANY')
and LEN(sep.Col) > 2
GROUP By sep.Col
HAVING count(*) > 1
Цените любые мысли о лучшем способе сделать это, решая проблему повторных слов.