Я хочу возвратить 10 наиболее распространенных слов из запроса в SQL-сервере, столь же рабочем против ряда строк, таких как это:
быстрая коричневая лиса
замедлите желтую лису
замедлите зеленую лису
возвратился бы
лиса
медленный
быстрый
коричневый
желтый
зеленый
Чтобы увидеть, как сделать это декларативно (т.е. без цикла while
), посмотрите ответ, над которым я работал (в частности, для кодового гольфа): Построить ASCII диаграмму наиболее часто используемых слов в данном тексте
Обратите внимание, что код по этой ссылке предназначен для того, чтобы содержать как можно меньше символов, а не для того, чтобы быть читаемым. Пожалуйста, используйте более описательные названия, по крайней мере.
Я бы попробовал выполнить функцию split (разделяющую каждое слово пробелом) над каждой возвращенной строкой, чтобы получить все отдельные слова во вспомогательной таблице. Используя следующий код, вы должны быть в состоянии разделить строку по пробелам:
CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
Вы должны вызвать эту функцию из курсора или чего-то подобного; внутри него просто используйте что-то вроде:
insert into #tmp (word) select * from dbo.split(' ', @row)
Наконец, вам нужно будет использовать простой запрос вроде:
select top 10 count(*) as number, word from separated_words_table order by number
Другой способ. («Заимствовано» у здесь )
WITH Sentences AS
(
SELECT 'quick brown fox' AS Sentence UNION ALL
SELECT 'slow yellow fox' UNION ALL
SELECT 'slow green fox'
),
Xmlified AS
(
SELECT
CAST('<M>' + REPLACE(Sentence,' ','</M><M>') + '</M>' AS XML) AS xSentence
FROM Sentences
),
Words AS
(
SELECT
Split.a.value('.', 'VARCHAR(100)') AS word
FROM Xmlified
CROSS APPLY xSentence.nodes('/M') Split(a)
)
SELECT COUNT(*) AS C, word FROM Words
GROUP BY word
ORDER BY C DESC