【问题标题】:Generate combinations of values in a column在列中生成值的组合
【发布时间】:2019-09-05 22:27:01
【问题描述】:

我有一个包含 3 列的表格。我需要生成基于特定"diagnosis" 执行的表的值(在“测试”列中)的combinations总是在 3's)。参考下表,对于每个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 文件中读取数据来实现这一点。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用自联接:

    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) 上使用推荐的索引,由于查询会产生大量数据,这也会很慢。

    【讨论】:

    • 解决方案不输出只有 2 个唯一值的 pat_id = '1002'。该逻辑还必须处理唯一值少于 3 个的实例。输出需要显示 {MRI, ELIZA} 用于诊断 = 肺炎。另外,请您指出如何辨别表格中出现次数最多的组合。
    • @marie20 。 . .那将是一个不同的问题。您明确声明:“请注意,组合应始终包含 3 个值。”如果你想要空值当没有三个时然后使用left join而不是inner join
    • 对造成的混乱表示歉意。该要求还要求,如果测试少于 3 个,则还应在输出中显示第三个位置为空/Null 值例如pat_id = 1002 -> {MRI,伊丽莎}。我尝试使用左连接,但无法让它工作。能否请你帮忙 ?另外,我如何得出数据集中出现最多的组合?提前致谢。
    • @marie20 。 . . 问题应作为 问题提出,而不是在 cmets 中。如果您对最常见的组合有疑问,请将其作为问题提出。
    • 我在第一次提交时就已经在这个问题中提到了这些要求。请参阅表格样本数据之后的段落。如果仍然需要,我仍然会创建一个新问题。请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多