Как можно получить n наиболее распространенные слова в ряде многих строк, возвращенных в запросе SQL Server?

Я хочу возвратить 10 наиболее распространенных слов из запроса в SQL-сервере, столь же рабочем против ряда строк, таких как это:

быстрая коричневая лиса
замедлите желтую лису
замедлите зеленую лису

возвратился бы
лиса
медленный
быстрый
коричневый
желтый
зеленый

6
задан Nick Haslam 8 July 2010 в 16:11
поделиться

3 ответа

Чтобы увидеть, как сделать это декларативно (т.е. без цикла while), посмотрите ответ, над которым я работал (в частности, для кодового гольфа): Построить ASCII диаграмму наиболее часто используемых слов в данном тексте

Обратите внимание, что код по этой ссылке предназначен для того, чтобы содержать как можно меньше символов, а не для того, чтобы быть читаемым. Пожалуйста, используйте более описательные названия, по крайней мере.

1
ответ дан 17 December 2019 в 04:41
поделиться

Я бы попробовал выполнить функцию 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

Источник здесь

3
ответ дан 17 December 2019 в 04:41
поделиться

Другой способ. («Заимствовано» у здесь )

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
1
ответ дан 17 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: