はあなたが最後の転送に興味を持っていた場合はそう
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'
を書くと放電する可能性がユニークなイベントですアンドリー・Mあなたはを、次のあなたがしたいような場合にはギャップや島々の問題(特に島)
を持って言及しているように、複数の訪問につながります次のサンプルデータ
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');
使用
DEMO
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
ます取得するには、次の結果
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を使用してイベントの順序を判断できます。
- あなたは、あなたのためにこの仕事をしてどのよう
ありがとうございます。最初の例は非常に参考になりましたが、2番目の例は私が探している構造にもっと役立ちました。私はまだ苦労している2つの分野があると思う。主なものは、私があなたの例の中で最も最近のものではなく、次の移転または退出で入場または移転を場所に関連付ける必要があることです。 1人の個人が1つの場所に対して複数の「イン/アウト」イベントを持つことができます。 – skyman
@bugy:同じ「VisitId」の同じ場所への複数の転送がありますか? –
はい。個人は「クリニック」を訪問することができます。クリニック訪問はVisitIdに関連付けられています。しかし、訪問の間に、彼らはある部屋から別の部屋に移動し、すでに入っていた部屋に戻ってくるかもしれません。彼らが部屋に入るたびに、履歴記録が作成されます(入場または転送)。彼らが出発するたびに、履歴レコードが作成されます(移送または退出)。問題は、特定の部屋の滞在期間を決定することです。これは、「イン」イベントとそれに続く「アウト」イベントとの間の時間差になる。 – skyman