找到一行和多行之间的相似度

时间:2016-07-19 03:04:46

标签: mysql

免责声明:我对MySQL很陌生,将此作为实验来了解更多信息。

基本上,我有一个表,其中一行是'主'行。我想将这一行与少数其他行进行比较。从这一点开始,我想选择一个与主行最“正确”或类似的那个并将其存储到变量中。如果少数行中没有一行与主设备相似,我只想取消操作。

我可以想办法用迭代来做到这一点,但我一直在阅读迭代是非常低效/使用SQL的不良做法,并想看看是否有另一种方式。

通过这个例子,我想选择提交2,并拒绝提交1和3.

Type, Answer 1, Answer 2, Answer 3
Master, 100, 200, 300
Submission 1, 100, 400, 300
Submission 2 , 100, 500, 500
Submission 3, 200, 100, 300

但是,在下面的示例中,我想要选择提交1,尽管两者不完全相同。

Type, Answer 1, Answer 2, Answer 3
Master, 100, 200, 300
Submission 1, 100, 400, 300
Submission 2 , 100, 500, 500
Submission 3, 500, 200, 300

最后,在这里我要选择提交1,因为它发生在提交3之前,尽管两者的正确程度相同。

.NET Core 1.0

1 个答案:

答案 0 :(得分:1)

尝试以下查询。它计算Master行与其他行共有的答案数。并且在按正确答案数量排列的情况下,它使用每个错误答案的数字差异来选择最接近的答案。

SELECT t.Type, t.Answer1, t.Answer2, t.Answer3,
       (t.a1 + t.a2 + t.a3) AS numRight,
       (t.d1 + t.d2 + t.d3) AS numOff
FROM
(
    SELECT t2.Type, t2.Answer1, t2.Answer2, t2.Answer3,
           CASE WHEN t1.Answer1 = t2.Answer1 THEN 1 ELSE 0 END AS a1,
           CASE WHEN t1.Answer2 = t2.Answer2 THEN 1 ELSE 0 END AS a2,
           CASE WHEN t1.Answer3 = t2.Answer3 THEN 1 ELSE 0 END AS a3,
           ABS(t1.Answer1 - t2.Answer1) ASd1,
           ABS(t1.Answer2 - t2.Answer2) AS d2,
           ABS(t1.Answer3 - t2.Answer3) AS d3
    FROM yourTable t1 INNER JOIN yourTable t2
        ON t1.Type = 'Master' AND t2.Type <> 'Master'
) t
ORDER BY numRight DESC, numOff

如果您只想要一行,可以在查询末尾添加LIMIT 1

在这里演示:

SQLFiddle