假設轉讓或放電。如果你有興趣在過去的轉移,你可以寫像這樣
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')
或放電,你會寫
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'
一個獨特的事件然而,如果訪問能導致多次訪問,因爲Andriy M提到你有間隙和孤島問題(特別是島嶼)
在這種情況下,你想要以下
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
DEMO
使用下面的示例數據
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');
你得到如下結果
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
注:
- 這假設你不關心沒有相應的排放/轉移的招生/轉運。
- 如果您知道輸入記錄後eventTime不會更改,則可以使用historyID而不是eventime來確定事件的順序。
- 你知道如何讓你喜歡的
謝謝你。第一個例子非常有幫助,雖然第二個例子更接近我期待的結構。我認爲還有兩個領域我正在掙扎。主要的一點是,我需要將入場或轉入地點與下一次轉會或轉出相關聯,而不是您的示例中最近的一次。一個人可能有多個「進/出」事件的單個位置。 – skyman
@bugy:對於同一個'VisitId',是否可以有多個傳輸到同一個位置? –
是的。個人可以訪問「診所」。訪問診所與VisitId相關聯。然而,在訪問期間,他們可能會從一個房間移到另一個房間,甚至可能會返回到他們已經進入的房間。每次他們搬到房間時,都會創建一個歷史記錄(入場或轉移)。每次他們離開時創建一個歷史記錄(轉移或卸載)。問題是確定特定房間的停留時間。這歸結於'進入'事件和隨後的'結束'事件之間的時間差異。 – skyman