db:多列之间的匹配和评分(3d数据集)

7gs2gvoe  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(236)

我的一个熟人询问了一个独特的sql任务。他们是生物技术研究人员,因此不精通sql。他们在excel中操作,这限制了他们进行分析的能力,并要求我提供帮助。对于如何选择这种解决方案的方法,我同样感到困惑,即编程方法或db查询就足够了。如果,db query,那么它应该是什么?从代码行和cpu周期/ram消耗的Angular 来考虑,因为这是一个大系统的一小部分。
问题集是关于不同样本之间的匹配。每个示例都有primarykey:memberid。每个memberid有6个参数得分。每个参数都是唯一的,因此参数之间不允许交叉匹配。如果参数与其他样本匹配,则得分为1。最高分为6分,最低分为0分。示例集如下:

原始输入是唯一的数据集。我已经将结果集可视化了。
条件如下:
特定分数只能与该特定分数匹配(i、 e分数1只能与其他分数1匹配)
一个查找查询,显示特定memberid的匹配项,该查询显示匹配项(memberid)(6/6、6/5等等)
显示表的统计信息的常规查询(总共6/6个匹配项、6/5个匹配项等等)
显示特定匹配项(6/6、6/5或6/4)等的查询。
我考虑将数据结构转换为:

然后使用groupby生成结果集。但是这个3d装置正在融合我的大脑。mysql和php使用的技术。对上面指定的结果集有帮助吗?

tnkciper

tnkciper1#

对于每个成员,您需要与其他成员匹配的分数数。我首先要说:

select s.memberid, s2.memberid,
      ( (s1.score1 = s2.score1) + (s1.score2 = s2.score2) + (s1.score3 = s2.score3) +
        (s1.score4 = s2.score4) + (s.score5 = s2.score5) + (s1.score6 = s2.score6)
      ) as scores_in_common
from sample s join
     sample s2
     on s.memberid <> s2.memberid;

对于你正在做的事情来说,这可能已经足够了。信息在结果集中,但格式不同。
对于您的特定格式:

select memberid,
       group_concat(case when scores_in_common = 6 then memberid2 end) as in_common_6,
       group_concat(case when scores_in_common = 5 then memberid2 end) as in_common_5,
       group_concat(case when scores_in_common = 4 then memberid2 end) as in_common_4,
       group_concat(case when scores_in_common = 3 then memberid2 end) as in_common_3,
       group_concat(case when scores_in_common = 2 then memberid2 end) as in_common_2,
       group_concat(case when scores_in_common = 1 then memberid2 end) as in_common_1
from (select s.memberid, s2.memberid as memberid2,
             ( (s1.score1 = s2.score1) + (s1.score2 = s2.score2) + (s1.score3 = s2.score3) +
               (s1.score4 = s2.score4) + (s.score5 = s2.score5) + (s1.score6 = s2.score6)
             ) as scores_in_common
      from sample s join
           sample s2
           on s.memberid <> s2.memberid
     ) ss
where scores_in_common >= 1
group by memberid;

相关问题