ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 通过decode计算相似度

通过decode计算相似度

原创 Linux操作系统 作者:junsansi 时间:2007-06-27 00:00:00 0 删除 编辑

之前工作的过程中,我们的用户系统在用户注册的时候会对用户做一些诸如心情啦爱好之类的调查,老板提了个有趣的需求,就是希望提供一个功能,可以让用户查看与自己爱好最相似的会员,并且按照相似度由大到小排序。

由于用户系统是即时都会有更新的,所以静态的可能性不大,只能用户查询的时候动态实现。后来我考虑通过decode实现,示例如下:


假设用户的爱好等调整项存储在表a如下
userid col1 col2 col3 col4 col5 col6
------ ---- ---- ---- ---- ---- ----
1 b c b b a c
2 a b a a b a
3 b a b b b d
4 b d a d a d
5 a c c b b b
6 a c b b c d
7 b c d b a d
8 c c b b a d
9 a d a a b c
10 b c a d a c
..................................................

需求:从表中任取一条记录,求取相似度,并按照与该记录相似度从大到小排序,如果相似度相同,则按照userid由大到小排序。
例如:求userid=4的相似度排序
USERID COL1 COL2 COL3 COL4 COL5 COL6 DD
------ ----- ----- ----- ----- ----- ----- ----------
10 b c a d a c 0.66
7 b c d b a d 0.5
9 a d a a b c 0.33
8 c c b b a d 0.33
3 b a b b b d 0.33
1 b c b b a c 0.33
6 a c b b c d 0.16
2 a b a a b a 0.16
5 a c c b b b 0

9 rows selected

SQL> select tmp1.*,

2 trunc((decode(col1, 'b', 1, 0) + decode(col2, 'd', 1, 0) +

3 decode(col3, 'a', 1, 0) + decode(col4, 'd', 1, 0) +

4 decode(col5, 'a', 1, 0) + decode(col6, 'd', 1, 0)) / 6,

5 2) dd

6 from tmp1

7 where userid != 4

8 order by dd desc,

11 userid desc

12 ;

USERID COL1 COL2 COL3 COL4 COL5 COL6 DD

------ ----- ----- ----- ----- ----- ----- ----------

10 b c a d a c 0.66

7 b c d b a d 0.5

9 a d a a b c 0.33

8 c c b b a d 0.33

3 b a b b b d 0.33

1 b c b b a c 0.33

6 a c b b c d 0.16

2 a b a a b a 0.16

5 a c c b b b 0

9 rows selected

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-22252/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 有趣的returning
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    640
  • 访问量
    4126004