G'day,我正在尝试开发一种方法来查询值与失败之间的兼容性或相似性。它不是最高或最低的AVG评级,而是一个数字或行上的值之间的最小差异。因此,如果结构类似于以下内容,其中RANK是用户的"评级"。
USER ITEM RANK
A x 5
B x 6
C x 2
A y 2
B y 3
C y 8
A z 7
B z 4
C z 4
最后,我希望能够对数据进行排序,比如:
用户A和用户B的平均评级差为3
用户A和用户C的平均评级差为4
用户B与用户C的平均评级差异为5
到目前为止,我唯一的想法是用每个排列建立一个临时表(巨大):
col1 col2 dif item
A B 1 x
A C 3 x
等等。。。然后用一个群求和。但这仍然不能正确处理用户A和C在某些项目上匹配得更接近,而在其他项目上的差异更大,超过了最初的接近程度的情况。有人能给我什么指示吗?
谢谢!
这是一个mysql5.5db,所以我在查询结构上缺少任何CTE或类似的东西。
可能使用自联接
select a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by item, diff_rank asc
为了避免重复值,您可以使用不同的
select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by item, diff_rank asc
为了获得差异最小的用户,您可以通过更改订单
select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by diff_rank asc