Question

J'ai un MSSQL 2005 tableau:

[Companies](
    [CompanyID] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](128),
    [Description] [nvarchar](256),
    [Keywords] [nvarchar](256)
)

Je veux générer un nuage de tags pour cette entreprises.Mais j'ai enregistré tous les mots clés dans une colonne séparée par des virgules.Des suggestions sur la façon de générer nuage de tags par la plupart des mots-clés utilisés.Il pourrait y avoir des millions de sociétés à environ dix mots-clés par l'entreprise.

Je vous remercie.

Était-ce utile?

La solution

Étape 1:séparer les mots clés dans une bonne relation (table).

CREATE TABLE Keywords (KeywordID int IDENTITY(1,1) NOT NULL
  , Keyword NVARCHAR(256)
  , constraint KeywordsPK primary key (KeywordID)
  , constraint KeywordsUnique unique (Keyword));

Étape 2:Carte de la plusieurs-à-plusieurs relation entre les entreprises et les balises dans une table distincte, comme tous les plusieurs-à-plusieurs relations:

CREATE TABLE CompanyKeywords (
   CompanyID int not null
   , KeywordID int not null
   , constraint CompanyKeywords primary key (KeywordID, CompanyID)
   , constraint CompanyKeyword_FK_Companies
      foreign key (CompanyID)
      references Companies(CompanyID)
   , constraint CompanyKeyword_FK_Keywords
      foreign key (KeywordID)
      references Keywords (KeywordID));

Étape 3:L'utilisation d'un simple GROUPE PAR requête pour générer le "cloud computing" (par exemple dans le "cloud" dans le sens le plus commun de 100 étiquettes):

with cte as (
SELECT TOP 100 KeywordID, count(*) as Count
FROM CompanyKeywords
group by KeywordID
order by count(*) desc)
select k.Keyword, c.Count
from cte c
join Keyword k on c.KeywordID = k.KeywordID;

Étape 4:mettre en cache le résultat de l'évolution de la que rarement et il calcule cher.

Autres conseils

Je préfère voir votre conception normalisée comme suggéré par Remus, mais si vous êtes à un point où vous ne pouvez pas changer votre design...

Vous pouvez utiliser une fonction d'analyse syntaxique (l'exemple que je vais utiliser est pris à partir de ici), pour analyser vos mots-clés et de les compter.

CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS 
BEGIN
   DECLARE @position int
   SET @position = 1
   SET @string = @string + @separator
   WHILE charindex(@separator,@string,@position) <> 0
      BEGIN
         INSERT into @parsedString
         SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position)
         SET @position = charindex(@separator,@string,@position) + 1
      END
     RETURN
END
go

create table MyTest (
    id int identity,
    keywords nvarchar(256)
)

insert into MyTest
    (keywords)
    select 'sql server,oracle,db2'
    union
    select 'sql server,oracle'
    union
    select 'sql server'

select k.string, COUNT(*) as count
    from MyTest mt
        cross apply dbo.fnParseStringTSQL(mt.keywords,',') k
    group by k.string
    order by count desc

drop function dbo.fnParseStringTSQL
drop table MyTest

Les deux Remus et Joe sont corrects mais oui comme quoi Joe a dit que si vous n'avez pas un choix, puis vous avez à vivre avec elle.Je pense que je peux vous offrir une solution facile en utilisant un Type de Données XML.Vous pouvez déjà visualiser facilement l'analyse de la colonne en faisant cette requête

WITH myCommonTblExp AS (
    SELECT CompanyID,
    CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
    FROM Companies
)
SELECT CompanyID, RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)

maintenant, sachant que vous pouvez le faire, tout ce que vous avez à faire est de les regrouper et de les compter, mais vous ne pouvez pas le groupe de méthodes XML donc, ma suggestion est de créer un affichage de la requête ci-dessus

CREATE VIEW [dbo].[DissectedKeywords]
AS
WITH myCommonTblExp AS (
    SELECT 
    CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
    FROM Companies
)
SELECT RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)
GO

et effectuer votre compte sur ce point de vue

SELECT Keywords, COUNT(*) AS KeyWordCount FROM DissectedKeywords
GROUP BY Keywords
ORDER BY Keywords

De toute façon, ici, est l'intégralité de l'article -->http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top