Giả sử việc chuyển giao hoặc giải ngũ là một sự kiện duy nhất mà bạn có thể viết như vậy
SELECT
b.EventTime - a.EventTime
FROM
Histories a
INNER JOIN Histories b
ON a.VisitID = b.VisitID
WHERE
a.event = 'Admission'
and
b.event in ('Transfer', 'Discharge')
Nếu bạn quan tâm đến lần chuyển nhượng hoặc giải ngũ cuối cùng, bạn sẽ viết thư
SELECT
b.EventTime - a.EventTime
FROM
Histories a
INNER JOIN Histories b
ON a.VisitID = b.VisitID
INNER JOIN
(SELECT
VisitId,
MAX(HistoryID) HistoryID
FROM Histories
WHERE
b.event in ('Transfer', 'Discharge')
GROUP BY
VisitId) maxHistory
ON b.HistoryID = maxHistoryId.HistoryId
WHERE
a.event = 'Admission'
Tuy nhiên, nếu một Lượt truy cập có thể dẫn đến nhiều lượt truy cập như Andriy M đề cập rằng bạn có vấn đề về Khoảng cách và các đảo (cụ thể là các đảo)
Trong trường hợp đó, bạn muốn những thứ sau
SELECT
a.VisitId,
a.Event a_Event,
a.Event b_Event,
a.EventTime a_EventTime,
b.EventTime b_EventTime,
b_EventTime - a_EventTime
FROM histories a
INNER JOIN histories B
ON a.visitID = b.visitID
AND a.EventTime < b.eventTime
INNER JOIN (SELECT a.VisitId,
a.EventTime a_EventTime,
Min(b.EventTime) b_EventTime
FROM histories a
INNER JOIN histories B
ON a.visitID = b.visitID
AND a.EventTime < b.eventTime
GROUP BY a_EventTime,
a.VisitId) MinTime
ON a.VisitID = MinTime.VisitID
AND a.EventTime = a_EventTime
AND b.EventTime = b_EventTime
Sử dụng dữ liệu mẫu sau
CREATE TABLE Histories
(
HistoryId int auto_increment primary key,
VisitId int,
Location varchar(20),
Event varchar(20),
EventTime datetime
);
INSERT INTO Histories
(VisitId, Location, Event, EventTime)
VALUES
(1, 'A', 'Admission', '2012-01-01'),
(1, 'A', 'Discharge', '2012-01-03'),
(2, 'B', 'Admission', '2012-01-02'),
(2, 'C', 'Transfer', '2012-01-05'),
(2, 'C', 'Discharge', '2012-01-06'),
(3, 'D', 'Admission', '2012-01-06'),
(3, 'E', 'Transfer', '2012-01-07'),
(3, 'F', 'Transfer', '2012-01-08'),
(3, 'F', 'Discharge', '2012-01-10');
Bạn nhận được kết quả sau
VISITID A_EVENT B_EVENT A_EVENTTIME B_EVENTTIME B_EVENTTIME - A_EVENTTIME
1 Admission Discharge January, 01 2012 00:00:00-0800 January, 03 2012 00:00:00-0800 2000000
2 Admission Transfer January, 02 2012 00:00:00-0800 January, 05 2012 00:00:00-0800 3000000
2 Transfer Discharge January, 05 2012 00:00:00-0800 January, 06 2012 00:00:00-0800 1000000
3 Admission Transfer January, 06 2012 00:00:00-0800 January, 07 2012 00:00:00-0800 1000000
3 Transfer Transfer January, 07 2012 00:00:00-0800 January, 08 2012 00:00:00-0800 1000000
3 Transfer Discharge January, 08 2012 00:00:00-0800 January, 10 2012 00:00:00-0800 2000000
Ghi chú:
- Điều này giả định rằng bạn không quan tâm đến Tuyển sinh / Bộ truyền chưa có đợt chuyển / chuyển tương ứng.
- Nếu bạn biết rằng thời gian sự kiện không thay đổi sau khi bản ghi được nhập, bạn có thể sử dụng historyID thay vì thời gian sự kiện để xác định thứ tự của các sự kiện.
- Bạn biết cách nhận chênh lệch Thời gian Sự kiện ở định dạng bạn thích