【问题标题】:MySQL: How to order an SQL query result by numerical difference of multiple rows?MySQL:如何通过多行的数值差异对 SQL 查询结果进行排序?
【发布时间】:2017-07-21 18:26:02
【问题描述】:

我有下表,我的目标是搜索与另一个给定客户在评价某些制造商方面最相似的客户。这个例子可以在SQL fiddle找到。

customer    manufacturer    rating
A           Manuf_A         8
A           Manuf_B         3
B           Manuf_A         4
B           Manuf_Y         3        
C           Manuf_X         3
C           Manuf_Y         7
D           Manuf_A         8
D           Manuf_B         7

示例:

我们想找出哪些客户最匹配客户 'A',他们对两个制造商 manuf_Amanuf_B 有评级。 p>

期望的结果:

customer    difference
D           4          
B           7
C           11

预期算法:

  • 差值越小,说明两个客户关系越密切
  • 如果客户不与目标客户共享任何制造商评级,则他们不存在的评级应该为零。

B 区别:

abs(A.manuf_A.rating (8) - B.manuf_A.rating(4)) = 4 
abs(A.manuf_B.rating (3) - B.manuf_B.rating(Doesn't exist/0)) = 3
= 4 + 3
= 7

C 区别:

abs(A.manuf_A.rating (8) - C.manuf_A.rating(Doesn't exist/0)) = 8
abs(A.manuf_B.rating (3) - C.manuf_B.rating(Doesn't exist/0)) = 3
= 8 + 3
= 11

D 差:

abs(A.manuf_A.rating (8) - D.manuf_A.rating(8)) = 0
abs(A.manuf_B.rating (3) - D.manuf_A.rating(7)) = 4
= 0 + 4
= 4

任何关于如何在 MySQL 中完成此操作的建议以及任何替代方法的建议都会受到欢迎。

【问题讨论】:

  • 只是评论:这是一个写得很好的问题。您提供了一个 SQL Fiddle 示例(有效)。你已经清楚地解释了这个问题。作为奖励,这是一个有趣的问题。
  • Euclidean distance 可能是更好的方法。
  • @PaulSpiegel 。 . .如果它能让你感觉更好,这就是所谓的曼哈顿距离,对于这样的问题是完全合理的。

标签: mysql sql


【解决方案1】:

这是一种方法。为“A”评级的客户和制造商生成所有行。然后使用left join 查找任何给定客户评分的那些。剩下的只是算术:

select c.customer,
       sum(abs(am.rating - coalesce(cd.rating, 0))) as similarity
from (select cd.manufacturer, cd.rating
      from centraldatabase cd
      where cd.customer = 'A'
     ) am cross join
     customers c left join
     centraldatabase cd
     on cd.manufacturer = am.manufacturer and cd.customer = c.customer
group by c.customer
order by similarity asc;

这是SQLFiddle。注意:我不知道在 SQL Fiddle 中创建自己的架构是否是个好主意。

【讨论】:

  • 非常感谢您的快速响应,因为这很好用!对 MySQL 来说相对较新,所以我很乐意花一点时间来消化这里发生的事情 :) 是的,架构创建可以解释一些奇怪的事情!
猜你喜欢
  • 2018-12-08
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多