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 द्वारा समूह नहीं कर सकते हैं। हमें प्रत्येक ICU यात्रा के लिए एक अलग रिकॉर्ड प्राप्त करना होगा।
इसे और अधिक स्पष्ट रूप से कहने के लिए, यदि कोई मरीज आईसीयू में समय बिताता है, तो इससे बाहर निकलता है और फिर वापस लौटता है, मुझे प्रत्येक आईसीयू यात्रा में खर्च किए गए कुल समय को पुनः प्राप्त करने की आवश्यकता है (अर्थात दो रिकॉर्ड)