假设数据库有5列数据,我一次性输入5个参数,想从这个数据库中把与它匹配度最高的一条记录找出来,用什么算法好啊?
匹配度最高可以假定为相等或者是相近。
为简单起见,暂时选择相等。
有5个接近就输出5个的,没有就找4个最接近的,以此类推。
以前看过类似的一篇神作,今天实在找不到了,大神们有什么好的解决思路,洗耳恭听中。
------解决方案--------------------
[email protected].@c5,字段为c1..c5
select t.*,
(case when c1 = @c1 then 1 else 0 end) +
(case when c1 = @c2 then 1 else 0 end) +
...
(case when c1 = @c5 then 1 else 0 end) +
(case when c2 = @c1 then 1 else 0 end) +
(case when c2 = @c2 then 1 else 0 end) +
...
(case when c2 = @c5 then 1 else 0 end) +
... cnt
from tb t
order by cnt desc
------解决方案--------------------
- SQL code
DECLARE @A INT,@B INT,@C INT,@D INT,@E INTSELECT TOP 1 WITH TIES A,B,C,D,EFROM TBWHERE [email protected] OR [email protected] OR [email protected] OR [email protected] OR [email protected]ORDER BY CASE WHEN [email protected] THEN 1 ELSE 0 END+CASE WHEN [email protected] THEN 1 ELSE 0 END+CASE WHEN [email protected] THEN 1 ELSE 0 END+CASE WHEN [email protected] THEN 1 ELSE 0 END+CASE WHEN [email protected] THEN 1 ELSE 0 ENDDESC
------解决方案--------------------
要是自由组合的话,写个自定义函数能从小到大取数,然后全套上这个函数就行了。
------解决方案--------------------
------解决方案--------------------
大乌龟小F看看这样行不
- SQL code
DECLARE @A INT,@B INT,@C INT,@D INT,@E INTSELECT TOP 1 WITH TIES A,B,C,D,EFROM TBWHERE A IN(@A,@B,@C,@D,@E) OR B IN(@A,@B,@C,@D,@E) OR C IN(@A,@B,@C,@D,@E) OR D IN(@A,@B,@C,@D,@E) OR E IN(@A,@B,@C,@D,@E) ORDER BY CASE WHEN A IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END+CASE WHEN B IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END+CASE WHEN C IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END+CASE WHEN D IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END+CASE WHEN E IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 ENDDESC
------解决方案--------------------
------解决方案--------------------