سؤال

لدي جدول MSSQL 2005:

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

أريد إنشاء سحابة علامة لهذه الشركات. لكنني قمت بحفظ جميع الكلمات الرئيسية في عمود واحد مفصولة بفواصل. أي اقتراحات لكيفية إنشاء سحابة العلامة بواسطة معظم الكلمات الرئيسية المستخدمة. يمكن أن يكون هناك ملايين الشركات تقريبًا عشر كلمات رئيسية لكل شركة.

شكرًا لك.

هل كانت مفيدة؟

المحلول

الخطوة 1: افصل الكلمات الرئيسية في علاقة مناسبة (جدول).

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

الخطوة 2: قم بتخطيط العلاقة بين العديد من الشركات بين الشركات والعلامات في جدول منفصل ، مثل جميع العلاقات العديدة إلى العدد:

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));

الخطوة 3: استخدم مجموعة بسيطة عن طريق الاستعلام لإنشاء "السحابة" (بالمثال على أخذ "السحابة" يعني أكثر 100 علامات شيوعًا):

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;

الخطوة 4: ذاكرة التخزين المؤقت للنتيجة لأنها نادراً ما تتغير وتُحسب على نحو هادف.

نصائح أخرى

أفضل رؤية التصميم الخاص بك تطبيع اقترحها ريموس, ، ولكن إذا كنت في مرحلة لا يمكنك تغيير التصميم الخاص بك ...

يمكنك استخدام وظيفة التحليل (المثال الذي سأستخدمه مأخوذة من هنا) ، لتحليل كلماتك الرئيسية وحسابها.

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

كل من ريموس وجو على صواب ولكن نعم كما قال جو إذا لم يكن لديك خيار ، فعليك أن تعيش معه. أعتقد أنه يمكنني تقديم حل سهل باستخدام نوع بيانات XML. يمكنك بالفعل عرض العمود المحسّن بسهولة عن طريق إجراء هذا الاستعلام

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)

الآن مع العلم أنه يمكنك القيام بذلك ، كل ما عليك فعله هو تجميعها والعد ، لكن لا يمكنك تجميع أساليب XML ، لذا فإن اقتراحي هو إنشاء عرض للاستعلام أعلاه

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

وأداء الاعتماد على هذا العرض

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

على أي حال هنا المقال الكامل ->http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-in--sql-to-rows/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top