我有一个包含 3 列的表格。我需要生成combinations
(始终为 3)基于特定 "diagnosis"
执行的表的值(在“测试”列中) 。引用下表,对于每个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'
,我们看到“test”列中有 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、诊断、测试)上使用推荐的索引
,由于查询将产生大量数据,速度也会很慢。
关于mysql - 生成列中值的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807637/