我有一张三列的桌子。我需要生成基于特定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/