เวอร์ชั่น MySQL
รหัสจะทำงานใน MySQL 5.5
พื้นหลัง
ฉันมีโต๊ะอย่างหนึ่งดังต่อไปนี้
CREATE TABLE t
( id INT NOT NULL AUTO_INCREMENT
, patient_id INT NOT NULL
, bed_id INT NOT NULL
, ward_id INT NOT NULL
, admitted DATETIME NOT NULL
, discharged DATETIME
, PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ตารางนี้เป็นเรื่องเกี่ยวกับผู้ป่วยในโรงพยาบาลและเก็บเตียงที่ผู้ป่วยแต่ละรายใช้เวลาสักพักขณะเข้ารับการรักษาในโรงพยาบาล
วอร์ดแต่ละคนอาจมีหลายเตียงและผู้ป่วยแต่ละรายอาจย้ายไปที่เตียงที่แตกต่างกันภายในวอร์ดเดียวกัน
วัตถุประสงค์
สิ่งที่ฉันต้องการจะทำคือการค้นหาว่าผู้ป่วยแต่ละคนใช้เวลาเท่าใดในวอร์ดเฉพาะโดยไม่ต้องย้ายไปวอร์ดอื่น คือฉันต้องการค้นหาระยะเวลารวมของเวลาติดต่อกันที่เขาใช้ในวอร์ดเดียวกัน
กรณีทดสอบ
-- Let's assume that ward_id = 1 corresponds to ICU (Intensive Care Unit)
INSERT INTO t
(patient_id, bed_id, ward_id, admitted, discharged)
VALUES
-- Patient 1 is in ICU, changes some beds, then he is moved
-- out of ICU, back in and finally he is out.
(1, 1, 1, '2015-01-06 06:05:00', '2015-01-07 06:04:00'),
(1, 2, 1, '2015-01-07 06:04:00', '2015-01-07 07:08:00'),
(1, 1, 1, '2015-01-07 07:08:00', '2015-01-08 08:11:00'),
(1, 4, 2, '2015-01-08 08:11:00', '2015-01-08 09:11:00'),
(1, 1, 1, '2015-01-08 09:11:00', '2015-01-08 10:11:00'),
(1, 3, 1, '2015-01-08 10:11:00', '2015-01-08 11:11:00'),
(1, 1, 2, '2015-01-08 11:11:00', '2015-01-08 12:11:00'),
-- Patient 2 is out of ICU, he gets inserted in ICU,
-- changes some beds and he is back out
(2, 1, 2, '2015-01-06 06:00:00', '2015-01-07 06:04:00'),
(2, 1, 1, '2015-01-07 06:04:00', '2015-01-07 07:08:00'),
(2, 3, 1, '2015-01-07 07:08:00', '2015-01-08 08:11:00'),
(2, 1, 2, '2015-01-08 08:11:00', '2015-01-08 09:11:00'),
-- Patient 3 is not inserted in ICU
(3, 1, 2, '2015-01-08 08:10:00', '2015-01-09 09:00:00'),
(3, 2, 2, '2015-01-09 09:00:00', '2015-01-10 10:01:00'),
(3, 3, 2, '2015-01-10 10:01:00', '2015-01-11 12:34:00'),
(3, 4, 2, '2015-01-11 12:34:00', NULL),
-- Patient 4 is out of ICU, he gets inserted in ICU without changing any beds
-- and goes back out.
(4, 1, 2, '2015-01-06 06:00:00', '2015-01-07 06:04:00'),
(4, 2, 1, '2015-01-07 06:04:00', '2015-01-07 07:08:00'),
(4, 1, 2, '2015-01-07 07:08:00', '2015-01-08 09:11:00'),
-- Patient 5 is out of ICU, he gets inserted in ICU without changing any beds
-- and he gets dismissed.
(5, 1, 2, '2015-01-06 06:00:00', '2015-01-07 06:04:00'),
(5, 3, 2, '2015-01-07 06:04:00', '2015-01-07 07:08:00'),
(5, 1, 1, '2015-01-07 07:08:00', '2015-01-08 09:11:00'),
-- Patient 6 is inserted in ICU and he is still there
(6, 1, 1, '2015-01-11 12:34:00', NULL);
ในตารางจริงแถวไม่ต่อเนื่อง แต่สำหรับผู้ป่วยแต่ละรายการประทับเวลาการปล่อยจากหนึ่งแถว == การประทับเวลาการรับเข้าของแถวถัดไป
SQLFiddle
http://sqlfiddle.com/#!2/b5fe5
ผลลัพธ์ที่คาดหวัง
ฉันต้องการเขียนสิ่งต่อไปนี้:
SELECT pid, ward_id, admitted, discharged
FROM (....)
WHERE ward_id = 1;
(1, 1, '2015-01-06 06:05:00', '2015-01-08 08:11:00'),
(1, 1, '2015-01-08 09:11:00', '2015-01-09 11:11:00'),
(2, 1, '2015-01-07 06:04:00', '2015-01-08 08:11:00'),
(4, 1, '2015-01-07 06:04:00', '2015-01-07 07:08:00'),
(5, 1, '2015-01-07 07:08:00', '2015-01-08 09:11:00'),
(6, 1, '2015-01-11 12:34:00', NULL);
โปรดทราบว่าเราไม่สามารถจัดกลุ่มโดย patient_id เราต้องดึงข้อมูลบันทึกแยกต่างหากสำหรับการเยี่ยมชมห้องไอซียูแต่ละครั้ง
หากผู้ป่วยใช้เวลาในห้องไอซียูแล้วย้ายออกจากห้องแล้วกลับมาที่นั่นฉันต้องเรียกเวลาทั้งหมดที่เขาใช้ในการเยี่ยมชมห้องไอซียูแต่ละครั้ง (เช่นสองบันทึก)