haiwer yangID:Haiwer
6602次访问,排名14699(-6)好友140人,关注者167
您可以用一些词来描述自己,如行业,爱好,职业,学校,公司等
[加为好友] [即时聊天] [发私信]
Haiwer的文章
原创 13 篇
翻译 0 篇
转载 1 篇
评论 58 篇
最近评论
linguo369:感谢提供!支持!!!
zhaozhengzzlt:谢谢 看看学习
ycj840212:顶一下.
bbqbin:顶了,收藏了
dengqiong080704:蛮好的,学习下
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 自定义函数查找相似记录和计算相似度收藏

    新一篇: 保持两表数据一致的触发器事例 | 旧一篇: 一个典型的Sql Server 触发器应用

    自定义函数查找相似记录和计算相似度 

    问题描述:

    表结构如下

    ShopID    Tag                    TagType
    --------------------------------------
    1      手抓肉 烤肉 抓饭 拉条子      2
    2      烤肉 抓饭 拉条子             2
    3      手抓肉 抓饭 拉条子           2
    4      手抓肉 烤肉 抓饭             2
    5      囊坑肉 大盘鸡 抓饭 拉条子    2
    6      拌面 烤肉 抓饭 拉条子        2
    7      手抓肉 大盘鸡 抓饭 拉条子    2

    需要搜索与提供的Tag内容(如手抓肉 烤肉 抓饭)相似的记录,并按照相似度从高到低排列,其中Tag是以空格分割的,如上的内容就是说Tag包含手抓肉,烤肉,抓饭,而其他数据只要包含其中一条就表示他们相似,包含的越多就表示越相似。
     

    用自定义函数查找记录和计算相似度,查询时按相似度排序,相似度的定义是,与提供的Tag中的一项相符的就加1,以最后的和来表示相似度。 

    --建立环境
    create table test1289(
    ShopID    int,
    Tag       nvarchar(50),            
    TagType int
    )
    insert test1289 select
    --------------------------------------
    1,      N'手抓肉 烤肉 抓饭 拉条子'   ,   2
    union all select
    2,      N'烤肉 抓饭 拉条子'          ,   2
    union all select
    3,      N'手抓肉 抓饭 拉条子'        ,   2
    union all select
    4,      N'手抓肉 烤肉 抓饭'          ,   2
    union all select
    5,      N'囊坑肉 大盘鸡 抓饭 拉条子'  ,  2
    union all select
    6,      N'拌面 烤肉 抓饭 拉条子'      ,  2
    union all select
    7,      N'手抓肉 大盘鸡 抓饭 拉条子'  ,  2

    go

    --函数
    alter function fn_相似记录(
    @Tag nvarchar(50)
    )
    returns @r table (                                                    --返回表
    ShopID    int,
    Tag       nvarchar(50),            
    TagType int,
    相似度 int
    )

    as
    begin
        declare @t nvarchar(50)                                      --存放中间字符串
        while charindex(' ',@Tag)>0                                --以空格分隔,循环找没一个项
        begin
            set @t=left(@Tag,charindex(' ',@Tag)-1)                 --取出中间字符串
            set @Tag=stuff(@Tag,1,charindex(' ',@Tag),'')      --往后移

            update @r                                                                      --已经有的记录相似度加1
              set 相似度=相似度+1
            where ' '+Tag+' ' like '% '+@t+' %'

            insert @r select t.*,1                                                     --没有的记录添加,相似度为1
            from test1289 t
            where ' '+Tag+' ' like '% '+@t+' %'
    and not exists ( select 1 from @r where ShopId=t.ShopId)
        end
        if @Tag<>''                                                                          --最后一个项
        begin
            set @t=@Tag
            update @r                                                                       --已经有的记录相似度加1
              set 相似度=相似度+1
            where ' '+Tag+' ' like '% '+@t+' %'

            insert @r select t.*,1                                                      --没有的记录添加,相似度为1
            from test1289 t
            where ' '+Tag+' ' like '% '+@t+' %'
    and not exists ( select 1 from @r where ShopId=t.ShopId)
        end
        return
    end

    go

    --测试调用
    select * from fn_相似记录(N'手抓肉 烤肉 抓饭') order by 相似度 desc
    go
    --结果
    ShopID      Tag                                                TagType     相似度        
    ----------- -------------------------------------------------- ----------- -----------
    4           手抓肉 烤肉 抓饭                                          2           3
    1           手抓肉 烤肉 抓饭 拉条子                                      2           3
    3           手抓肉 抓饭 拉条子                                         2           2
    7           手抓肉 大盘鸡 抓饭 拉条子                                     2           2
    2           烤肉 抓饭 拉条子                                          2           2
    6           拌面 烤肉 抓饭 拉条子                                       2           2
    5           囊坑肉 大盘鸡 抓饭 拉条子                                     2           1

    (所影响的行数为 7 行)


    --删除环境
    drop function fn_相似记录
    drop table test1289

     

    发表于 @ 2007年07月27日 15:30:00|评论(loading...)|编辑

    新一篇: 保持两表数据一致的触发器事例 | 旧一篇: 一个典型的Sql Server 触发器应用

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Haiwer