微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

group_concat 分隔重叠日期并合并名称

如何解决group_concat 分隔重叠日期并合并名称

让我解释一下目前的情况:
表结构和数据概览:
我有一个表,其中包含每个药物的患者 ID、药物名称、情节_no 及其开始和结束日期。这是仅一名患者的快照。因此,该患者正在使用 2 种药物 X 和 Y。药物 X 的第一次发作于 2013-01-22 开始,并于 2013-04-22 结束。同理,由于第二种药也是X药,所以是第二集。当药物发生变化时,视为新药的第一次发作,以此类推。

PATIENT_ID 药物 EPISODE EPISODE_START EPISODE_END
773 X 1 2013-01-22 00:00:00 2013-04-22 00:00:00
773 X 2 2013-06-02 00:00:00 2014-03-12 00:00:00
773 Y 1 2013-10-28 00:00:00 2014-01-22 00:00:00

要求:
我需要为每个患者制定药物治疗方案。我将解释如何: 如果我们在时间线中绘制这些数据,我们将得到如下结果:

2013-01-22              2013-04-22
|------------X--------------|
2013-06-02                             2014-03-12
|------------------X-------------------|
2013-10-28              2014-01-22
|----------Y------------|

现在需要按以下顺序创建方案:

2013-01-22              2013-04-22
|------------X--------------|
2013-06-02                             2014-03-12
|------X-----|---------X+Y------------|-----X------|
2013-10-28              2014-01-22
|----------X+Y-----------|

在这种情况下,方案将是在特定时间段内使用的药物组合。
方案一:2013年1月22日至2013年4月22日期间的药物X,
方案二:2013年6月22日至2013年10月28日期间的药物X,
Regimen 3:药物 X+Y 从日期 2013-10-28 到 2014-01-22,最后
方案 4:从 2014-01-22 到 2014-03-12 的药物 X。

最后,表格将是这样的:

PATIENT_ID DRUG_TAKEN REGIMEN_NO REGIMEN_START REGIMEN_END
773 X 1 2013-01-22 00:00:00 2013-04-22 00:00:00
773 X 2 2013-06-02 00:00:00 2013-10-28 00:00:00
773 X+Y 3 2013-10-28 00:00:00 2014-01-22 00:00:00
773 X 4 2014-01-22 00:00:00 2014-03-12 00:00:00

注意:中间有一个日期:2013-04-22 到 2013-06-02,该日期没有患者服用的药物。

我不明白如何使用 group_concat 来隔离日期和组合药物。任何人都可以帮我解决这个问题。先感谢您。

解决方法

我正在使用 MySQL 的过时版本,因此您需要对其进行更新以利用 8+ 中可用的工具,以便构建与我的日历表等效的表,以及方案编号...

DROP TABLE IF EXISTS  my_table;

CREATE TABLE my_table
(PATIENT_ID INT NOT NULL,DRUG CHAR(1) NOT NULL,EPISODE INT NOT NULL,EPISODE_START DATE NOT NULL,EPISODE_END DATE NULL,PRIMARY KEY(patient_id,drug,episode)
);

INSERT INTO my_table VALUES
(773,'X',1,'2013-11-28','2013-12-12'),(773,2,'2013-12-20','2014-01-06'),'Y','2013-12-28','2014-01-03');

查询...

SELECT patient_id,MIN(dt) r_start,MAX(dt) r_end,drugs,i regimen
  FROM
    (
    SELECT dt,patient_id,CASE WHEN @prev_patient = patient_id 
            THEN CASE WHEN @prev_drugs = drugs 
                      THEN CASE WHEN @prev_dt = dt - INTERVAL 1 DAY 
                                THEN @i:=@i 
                                ELSE @i:=@i+1 END
                      ELSE @i:=@i+1 END
            ELSE @i:=@i+1 END i,@prev_patient := patient_id,@prev_drugs := drugs,@prev_dt := dt
      FROM 
      (
       SELECT dt,x.patient_id,GROUP_CONCAT(drug ORDER BY drug) drugs
                FROM dates 
                JOIN my_table x
                  ON dt BETWEEN episode_start AND episode_end
               GROUP
                  BY dt,patient_id
               ORDER
                  BY patient_id,dt
        ) n JOIN (SELECT @prev_patient := null,@prev_drugs := null,@prev_dt := null,@i:=0) vars
        ) m 
        GROUP 
           BY patient_id,i
          ORDER BY patient_id,regimen;

+------------+------------+------------+-------+---------+
| patient_id | r_start    | r_end      | drugs | regimen |
+------------+------------+------------+-------+---------+
|        773 | 2013-11-28 | 2013-12-12 | X     |       1 |
|        773 | 2013-12-20 | 2013-12-27 | X     |       2 |
|        773 | 2013-12-28 | 2014-01-03 | X,Y   |       3 |
|        773 | 2014-01-04 | 2014-01-06 | X     |       4 |
+------------+------------+------------+-------+---------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。