【问题标题】:SQL - Count every possible combinationSQL - 计算所有可能的组合
【发布时间】:2015-11-10 07:32:36
【问题描述】:

我有一张包含诊断和患者 ID 的表格。该表的每个诊断都有一行,带有患者 ID 和诊断。

例如

Patient ID | Diagnosis
-----------|----------
0          | Asthma
1          | Hypertension
1          | Asthma
2          | Asthma
2          | Hypertension
2          | Cancer
3          | Asthma

我想输出一些类似的东西

Asthma                          | 4
Hypertension                    | 2
Asthma & Hypertension           | 2
Asthma, Hypertension and Cancer | 1

如何计算与诊断名称组合的诊断数量?

即x 患者患有哮喘,x 患者患有哮喘和高血压,x 患者患有糖尿病、心脏病、肺病、癌症等。

有些患者有多达 12 个诊断。提前谢谢!

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需结果(以表格格式)。另外,用您正在使用的数据库标记问题。
  • Gordon,在这种情况下数据库真的重要吗?当然,这是一个方法问题,而不是语法问题?他确实很好地描述了数据
  • @Kevin..这将是 2**12 = 4096 个组合,而不是 12 个!
  • @vkp 信息太少,无法确定组合的数量,因为可供选择的诊断集中的元素数量未知,但假设有 100 个可能的诊断,那么您可以选择 1 100 种方式,4950 种方式中的 2 种方式,近 400 万种方式中的 4 种方式和 ~1*10**15 种方式中的 12 种方式(如果我记得如何正确计算组合)。
  • @Samcd 据我所知,Postgres 是唯一可以执行此类数组操作的 DBMS。但是您也可以使用纯字符串连接来做到这一点:sqlfiddle.com/#!4/fb6c9/3 虽然它可能没有那么有效。此外,在 Oracle 中,诊断元素的完整列表限制为 4000 字节(如果启用了扩展字符串,则在 Oracle 12 中为 32k)

标签: sql


【解决方案1】:

这可能需要比我更精通使用FOR XML 连接行的人进行编辑,但这是一种方法:

WITH CTE AS (
SELECT
PatientID,
STUFF(
    (
    SELECT ', ' + [Diagnosis] 
    FROM Table 
    WHERE (PatientID = B.PatientID) 
    ORDER BY Diagnosis
    FOR XML PATH('')
    )
    ,1,1,'') AS Diagnoses
FROM Table B
  )

SELECT Diagnoses,COUNT(DISTINCT PatientID) as Total
FROM CTE
GROUP BY Diagnoses

基本上,您正在为每个患者的所有诊断创建一个连接值,在按诊断排序之后(即'Condition1,Condition2''Condition2,Condition1' 的读取方式不同),然后创建第二个查询以获取每个患者的计数组合

【讨论】:

  • @jpw 你是对的。我没有太多使用 FOR XML 的经验,所以我认为它们会被自动分组,并且会处理重复值。
【解决方案2】:

如果我理解正确,您可以使用递归查询来做到这一点:

with recursive all_diags as (
   select patient_id, diagnosis, diagnosis as diagnosis_list
   from diagnostics
   union all 
   select c.patient_id, c.diagnosis, p.diagnosis_list||','||c.diagnosis
   from diagnostics c
     join all_diags p on p.patient_id = c.patient_id and p.diagnosis < c.diagnosis
)
select diagnosis_list, count(*)
from all_diags
group by diagnosis_list
order by diagnosis_list;

请注意,SQL 标准需要关键字recursive,但并非所有 DBMS 实际上都支持使用该关键字。

但您的预期输出有所不同:我的解决方案还返回组合:CancerCancer,HypertensionAsthma,Cancer,您未在示例输出中包含这些组合。

这是一个 SQLFiddle 示例:http://sqlfiddle.com/#!15/21087/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多