mysql - 生成列中值的组合

标签 mysql sql

我有一个包含 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/

相关文章:

java - 如何使用 Eclipse 中的数据库

mysql - SQL 连接查询中的一行

c# - Linq to sql 表达式树执行区问题

sql - 如何使用 SQL 为数据库表添加电话号码?

java - 解析 MappingNode 时主线程中出现异常

php - mysql查询上的EXISTS查询优化

mysql - 如何在netezza中制作时间维度?

c# - 在复杂的大型 SQL 数据库上创建清晰的抽象层

mysql - 有条件地隐藏 SELECT 子句中的列

php - 使用 PHP 在 mySQL 上存储信息