MySQL:根据两列之间的条件合并表中行中的数据
我在医院里有一张这样的床桌MySQL:根据两列之间的条件合并表中行中的数据,mysql,join,Mysql,Join,我在医院里有一张这样的床桌 patient_id date_started date_stopped 1 2018-01-10 2018-01-15 1 2018-01-15 2018-01-28 1 2018-01-28 2018-02-05 2 2018-01-15 2018-02-10 2
patient_id date_started date_stopped
1 2018-01-10 2018-01-15
1 2018-01-15 2018-01-28
1 2018-01-28 2018-02-05
2 2018-01-15 2018-02-10
2 2018-03-05 2018-04-12
3 2018-01-10 2018-01-20
3 2018-01-20 null
4 2018-02-10 2018-02-10
现在,我不希望患者的停止日期与另一行的开始日期相同的行。我希望输出像这样
patient_id date_started date_stopped
1 2018-01-10 2018-02-05
2 2018-01-15 2018-02-10
2 2018-03-05 2018-04-12
4 2018-02-10 2018-02-10
如果我做内部连接,我会得到多行
SELECT
*
FROM bed AS bed_1
INNER JOIN bed_2
ON bed_2.patient_id = bed_1.patient_id
AND bed_2.date_started != bed_2.date_stopped
解决这个问题的最佳方法是什么?可以通过编写一个接受 患者id和日期停止并递归,直到停止日期不等于同一患者的下一个开始日期
CREATE PROCEDURE FINAL_STOP_DATE(IN patientId INT,IN dateStopped DATETIME, OUT finalStopDate DATETIME)
+ BEGIN
+ DECLARE current_patient INT;
+ DECLARE curr_start_date DATETIME;
+ DECLARE curr_stop_date DATETIME;
+ SET max_sp_recursion_depth = 250;
+ SELECT patient_id,
+ date_started,date_stopped
+ INTO current_patient,curr_start_date,curr_stop_date
+ FROM bed
+ WHERE patient_id = patientId AND date_started = dateStopped
+ LIMIT 1;
+ if current_patient = patientId AND curr_start_date = dateStopped THEN
+ CALL FINAL_STOP_DATE(current_patient, curr_stop_date, finalStopDate);
+ ELSE
+ SET finalStopDate = dateStopped;
+ END IF ;
+ END;
因此,该程序的输出是给定患者的最终停止日期,不包括中间所有连续的开始和停止日期
我们可以为bed表中的每条记录调用此过程,并选择此过程的输出作为date_END列。为了实现这一点,我们需要编写一个中介函数,因为我们不能从SQL中的select子句调用过程
CREATE FUNCTION GET_FINAL_STOP_DATE(patientId INT, date_stopped DATETIME)
+ RETURNS DATETIME
+ BEGIN
+ DECLARE final_stop_date DATETIME;
+ CALL FINAL_STOP_DATE(patientId, date_stopped, final_stop_date);
+ RETURN final_stop_date;
+ END;
现在从select子句调用此函数,该子句将选择返回值作为结果集中的date\u ended列Now do GROUP BY patient\u id、date\u ended,并选择MIN date\u started
SELECT patient_id,
MIN(date_started),
GET_FINAL_STOP_DATE(patient_id,date_stopped) AS date_ended
FROM bed
GROUP BY patient_id, date_ended
最终的结果是
patient_id date_started date_ended
1 2018-01-10 2018-02-05
2 2018-01-15 2018-02-10
2 2018-03-05 2018-04-12
3 2018-01-10 null
4 2018-02-10 2018-02-10
最后,添加一个where条件,说明date_ended不应为null,以获得预期结果是否有此表的主键?请参见“是”。我们有一个主键