【问题标题】:MySQL Select only one row from each patient diagnosed according the first dateMySQL 从根据第一个日期诊断的每个患者中仅选择一行
【发布时间】:2018-01-04 10:43:43
【问题描述】:

编辑

我不能只用patient_idgroup by,我会得到sql_mode=only_full_group_by...的错误

我有以下查询,可帮助我获取所有被诊断患有糖尿病的患者的名单:

SELECT t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'key1') USING utf8mb4) as patient_name_en,
t3.date_of_visit as date_of_visit, 
t2.diagnosis_name,
max(ifnull(t5.date_of_assessment, 'N/A')) as date_of_assessment,
ifnull(t5.assessment_result, 0) as assessment_result 
FROM consultation t1
LEFT JOIN diagnosis t2 ON t1.diagnosis_id = t2.diagnosis_id
LEFT JOIN visit t3 ON t3.visit_id = t1.visit_id
LEFT JOIN patient t4 ON t4.patient_id = t3.patient_id
LEFT JOIN diabetes_assessment t5 ON t5.patient_id = t4.patient_id
WHERE t2.diagnosis_name LIKE '%Diabetes%' AND t1.clinic_id = '361'
AND t3.visit_status="Active"
GROUP BY t1.patient_id, t5.date_of_assessment, t4.patient_name_en, t3.date_of_visit, t2.diagnosis_name, t5.assessment_result
ORDER BY t5.date_of_assessment DESC

结果是:

如您所见,如果患者多次被诊断出患有不同类型或不同程度的糖尿病,则所有行都会显示出来。但我真正想要的是他第一次被诊断出来,所以结果只会是这两行以蓝色突出显示:

在这里,患者 0361 在2017-04-06 首次被诊断出患有糖尿病。所以我们只得到这个病人的这一行。

我尝试使用 `min(t3.date_of_visit) 但无法正常工作。

【问题讨论】:

标签: mysql sql


【解决方案1】:

我认为您想要的是第一次访问和最后一次糖尿病评估。我假设您所有表格中的第一个字段是 auto_increment 字段,并且小提琴中的consultation_id 输入错误。

鉴于以上情况

MariaDB [sandbox]> select p.patient_name_en,v.*,c.diagnosis_id,d.diagnosis_name,da.date_of_assessment,da.assessment_result
    -> from visit v
    -> join patient p on p.patient_id = v.patient_id
    -> join consultation c on c.patient_id = v.patient_id and c.visit_id = v.visit_id
    -> join diagnosis d on d.diagnosis_id = c.diagnosis_id
    -> left join
    -> (
    -> select da.patient_id, da.date_of_assessment,da.assessment_result
    -> from diabetes_assessment da
    -> where da.diabetes_assessment_id  = (select max(da1.diabetes_assessment_id) from diabetes_assessment da1 where da1.patient_id = da.patient_id)
    -> ) da on da.patient_id = v.patient_id
    -> where v.visit_id = (select min(visit_id) from consultation c where c.patient_id = v.patient_id)
    -> and c.diagnosis_id in (1,2)
    -> and v.clinic_id = 361
    -> ;
+-----------------+----------+------------+-----------+---------------+--------------+--------------+---------------------------------------------+--------------------+-------------------+
| patient_name_en | visit_id | patient_id | clinic_id | date_of_visit | visit_status | diagnosis_id | diagnosis_name                              | date_of_assessment | assessment_result |
+-----------------+----------+------------+-----------+---------------+--------------+--------------+---------------------------------------------+--------------------+-------------------+
| ABC             |        1 | 361-9001   |       361 | 2017-03-03    | Active       |            1 | Diabetes mellitus with diabetic nephropathy | 2017-05-05         |             40.00 |
| XYZ             |        3 | 361-0361   |       361 | 2017-10-03    | Active       |            2 | E01 Diabetes mellitus with kidney disease   | 2017-03-10         |             30.50 |
+-----------------+----------+------------+-----------+---------------+--------------+--------------+---------------------------------------------+--------------------+-------------------+
2 rows in set (0.00 sec)

【讨论】:

  • 它有效。但我无法添加此行and c.diagnosis_id in (1,2),因为有多种类型的糖尿病具有不同的 ID。
  • 公平的,我有点懒,试着用你喜欢的条件代替。
  • 在哪个选择?潜艇?
  • and c.diagnosis_id in (1,2) >> and d.diagnosis_name LIKE '%Diabetes%'
【解决方案2】:

解决方案 1: 使用Window Functions 将数据库更改为某种东西,因为显然MySQL 在这个领域有很大的缺点(for example)。这可以节省您的时间

解决方案 2:您可能无法接受第一个解决方案,您可以尝试使用类似

    select t1.patient_id, min(t3.date_of_visit) "date_of_visit" 
    from consultation t1 
    LEFT JOIN visit t3 ON t3.visit_id = t1.visit_id
    group by t1.patient_id

您可以将其作为子查询加入或将其放入某个表中(甚至可能是临时表)。然后应该由patientdate_of_visit 完成加入。

不幸的是,除非您提供像草莓这样的 MCVE 请求,否则很难提供更多帮助。

【讨论】:

    【解决方案3】:

    只需保留 group by 子句t1.patient_id, t5.date_of_assessment

    所以我读了this doc 如果您不要求按援助日期按订单排序,请将其删除,或者在分组中保持相同。

    【讨论】:

    • 如果您需要每位患者 1 行,只需按患者 ID 分组。
    • 我做到了,现在我得到了Error Code: 1055. Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ncd.t2.diagnosis_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    • 我需要按所有字段分组,当我在某处阅读时,我们无法将 group by 的 sql 模式更改为 null
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多