2013年(350)
分类: Oracle
2013-04-24 13:13:30
之前工作的过程中,我们的用户系统在用户注册的时候会对用户做一些诸如心情啦爱好之类的调查,老板提了个有趣的需求,就是希望提供一个功能,可以让用户查看与自己爱好最相似的会员,并且按照相似度由大到小排序。
由于用户系统是即时都会有更新的,所以静态的可能性不大,只能用户查询的时候动态实现。后来我考虑通过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