Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:根据两列之间的条件合并表中行中的数据_Mysql_Join - Fatal编程技术网

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,以获得预期结果

是否有此表的主键?请参见“是”。我们有一个主键