我有一张三列的桌子。我需要生成基于特定combinations执行的表的值(总是在“ tests”列中)的"diagnosis"(总是以3表示)。参考下表,对于每个cust_id,都有一个"diagnosis"列,基于该列执行"tests"。现在,对于每个诊断值组,我需要在“测试”列中生成相应值的唯一组合。注意,组合应始终带有3个值。

患者:

pat_id | diagnosis | tests

1001 | Thyroid | CAT
1001 | Thyroid | MRI
1001 | Thyroid | Blood

1001 | Tonsil  | CAT
1001 | Tonsil  | MRI
1001 | Tonsil  | Blood
1001 | Tonsil  | RAPID

1002 | Pneumonia | MRI
1002 | Pneumonia | Eliza


因此,对于pat_id = '1001'diagnosis = 'Thyroid',我们看到“测试”具有3个不同的值。因此,只有1个唯一的组合是可能的,即{CAT, MRI, Blood}
同样,对于pat_id = '1001'diagnosis = 'Tonsil',我们在“测试”列中看到4个不同的值。因此,将有4个组合,即{CAT, MRI, Blood}{CAT, MRI, RAPID}{MRI, Blood, RAPID}{CAT, blood, RAPID}
对于pat_id = '1002',仅存在两个唯一值。因此,组合将仅为1,即{MRI, Eliza}
这样,我需要为组中的所有诊断值生成相似的组合,并输出唯一的组合,该组合出现的次数比该表中的其他组合最多。

请注意,应随时使用3个值进行组合。

该表中大约有25 Mil个记录。那么,有什么方法可以在MySQL中有效地实现这一点而又不会对性能产生重大影响?

PS:如果需要,我们有一个python环境,可以根据需要通过从csv文件中读取数据来实现此环境。

最佳答案

您可以使用自联接:

select p1.pat_id, p1.diagnosis, p1.tests, p2.tests, p3.tests
from patient p1 join
     patient p2
     on p1.pat_id = p2.pat_id and p1.diagnosis = p2.diagnosis and
        p1.tests < p2.tests join
     patient p3
     on p2.pat_id = p3.pat_id and p2.diagnosis = p3.diagnosis and
        p2.tests < p3.tests ;


即使在(pat_id, diagnosis, tests)上使用推荐的索引,由于查询将产生的数据量很大,这也将很慢。

关于mysql - 在列中生成值的组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57807637/

10-16 13:27