通過decode計算相似度

junsansi發表於2007-06-27

之前工作的過程中,我們的使用者系統在使用者註冊的時候會對使用者做一些諸如心情啦愛好之類的調查,老闆提了個有趣的需求,就是希望提供一個功能,可以讓使用者檢視與自己愛好最相似的會員,並且按照相似度由大到小排序。

由於使用者系統是即時都會有更新的,所以靜態的可能性不大,只能使用者查詢的時候動態實現。後來我考慮通過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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章