মাইএসকিউএল সংস্করণ
কোডটি মাইএসকিউএল 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);
দয়া করে মনে রাখবেন যে আমরা রোগী_দিক দিয়ে গ্রুপ করতে পারি না। আমাদের অবশ্যই প্রতিটি আইসিইউ ভ্রমণের জন্য একটি পৃথক রেকর্ড পুনরুদ্ধার করতে হবে।
এটিকে আরও স্পষ্টভাবে বলতে গেলে, যদি কোনও রোগী আইসিইউতে সময় ব্যয় করে, তবে সেখান থেকে সরিয়ে নিয়ে আবার সেখানে ফিরে আসে, প্রতিটি আইসিইউ পরিদর্শনকালে তিনি মোট সময় ব্যয় করেছেন (যেমন দুটি রেকর্ড)