2010-07-08 2 views
6

Je veux revenir les 10 mots les plus communs d'une requête dans le serveur SQL, donc en cours d'exécution contre un ensemble de lignes comme celle-ci:Comment obtenir les mots les plus courants dans un ensemble de plusieurs lignes renvoyées dans une requête SQL Server?

quick brown fox
renard jaune lent
renard vert lent

retournerait
fox
lent
rapide
brun
jaune
green

+1

drôle que vous mentionner que ... Voir http://stackoverflow.com/questions/3169051/code-golf-word-frequency-chart/3173246#3173246 – Gabe

+0

Ooh, c'est parfait. Merci! Vous devriez ajouter cela comme une réponse .. –

Répondre

1

Pour voir comment faire déclarative (sans une boucle while), voir une réponse sur laquelle j'ai travaillé (pour un code golf de toutes choses): Build an ASCII chart of the most commonly used words in a given text

Notez que le code en tha Le lien t est destiné à avoir le moins de caractères possible, à ne pas être lisible. Veuillez utiliser des noms plus descriptifs, au moins.

3

J'essaierais d'exécuter une fonction de division (en séparant chaque mot dans un espace) sur chaque ligne retournée afin d'obtenir tous les mots séparés dans une table auxiliaire. En utilisant le code suivant, vous devriez être en mesure de diviser une ligne par ses espaces:

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 

Vous devez appeler cette fonction à partir d'un curseur ou quelque chose; à l'intérieur, il suffit d'utiliser quelque chose comme:

insert into #tmp (word) select * from dbo.split(' ', @row) 

Enfin, vous ne devez utiliser une requête simple comme:

select top 10 count(*) as number, word from separated_words_table order by number 

Source here

1

Une autre façon. ("Emprunté" de here)

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 
+0

C'est cool mais il s'est étouffé sur les esperluettes pour moi. Je l'ai résolu en les remplaçant d'abord dans la phrase comme 'CAST ('' + REMPLACER (Remplacer (Phrase, '&', 'amp;'), '', '') + '' comme AS XML) AS xSentence' – shanabus

+1

@shanabus si vous utilisez 2016, utilisez plutôt https://docs.microsoft.com/fr-fr/sql/t-sql/functions/string-split-transact-sql –

Questions connexes