group_concat 分离重叠日期并合并名称
group_concat to segregate overlapping dates and combine names
让我解释一下目前的情况:
Table 数据结构和概览:
对于每种药物及其开始和结束日期,我有一个 table 和 patient_ids、drug_name、episode_no。这只是一个病人的快照。所以这个病人正在使用 2 种药物 X 和 Y。药物 X 的第一集从 2013-01-22 开始,到 2013-04-22 结束。同样,由于第二种药物也是药物X,所以是第二集。当药物发生变化时,视为新药物的第一集,依此类推。
PATIENT_ID
DRUG
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
要求:
我需要为每位患者制定药物治疗方案。我将解释如何:
如果我们在时间轴上绘制这些数据,我们将得到如下结果:
现在需要按以下顺序创建方案:
在这种情况下,方案将是在特定时间段内使用的药物组合。
方案 1:药物 X 从日期 2013-01-22 到 2013-04-22,
方案 2:药物 X 从日期 2013-06-22 到 2013-10-28,
方案 3:药物 X+Y 从日期 2013-10-28 到 2014-01-22,最后
方案 4:药物 X 从日期 2014-01-22 到 2014-03-12。
最后,最后table会是这样的:
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+ 中可用的工具,以便构建与我的日历等效的日历 table,以及方案编号...
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 ,'X',2,'2013-12-20','2014-01-06'),
(773 ,'Y',1,'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
, drugs
, 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
, drugs
, 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 |
+------------+------------+------------+-------+---------+
让我解释一下目前的情况:
Table 数据结构和概览:
对于每种药物及其开始和结束日期,我有一个 table 和 patient_ids、drug_name、episode_no。这只是一个病人的快照。所以这个病人正在使用 2 种药物 X 和 Y。药物 X 的第一集从 2013-01-22 开始,到 2013-04-22 结束。同样,由于第二种药物也是药物X,所以是第二集。当药物发生变化时,视为新药物的第一集,依此类推。
PATIENT_ID | DRUG | 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 |
要求:
我需要为每位患者制定药物治疗方案。我将解释如何:
如果我们在时间轴上绘制这些数据,我们将得到如下结果:
现在需要按以下顺序创建方案:
在这种情况下,方案将是在特定时间段内使用的药物组合。
方案 1:药物 X 从日期 2013-01-22 到 2013-04-22,
方案 2:药物 X 从日期 2013-06-22 到 2013-10-28,
方案 3:药物 X+Y 从日期 2013-10-28 到 2014-01-22,最后
方案 4:药物 X 从日期 2014-01-22 到 2014-03-12。
最后,最后table会是这样的:
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+ 中可用的工具,以便构建与我的日历等效的日历 table,以及方案编号...
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 ,'X',2,'2013-12-20','2014-01-06'),
(773 ,'Y',1,'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
, drugs
, 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
, drugs
, 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 |
+------------+------------+------------+-------+---------+