Tło:uzyskać różnicę między dwoma czasami dla SQL Server 2012
Próbuję określić długość czasu Klient spędza w danym pomieszczeniu. Każdy klient można zidentyfikować za pomocą numeru CustomerID
, a po jego odwiedzeniu otrzymuje on numer VisitNumber
. Na przykład, jeśli klient odwiedził dzisiaj dostaną VisitNumber
powiedzmy 111111. Będą one następnie opuścić i wrócić w przyszłym tygodniu i będzie miał VisitNumber
z 111112.
gdy klient pierwszych wizyt nie są początkowo przypisane pokój , a gdy zostaną ostatecznie przypisane wyznaczone pomieszczenia, do bazy danych zostanie wpisany wpis. CurrentRoom
byłby pusty, ponieważ nie ma jeszcze pokoju, a NewRoom
to pomieszczenie, do którego zostali przeniesieni.
Ten wpis zostanie zarejestrowany jako zdarzenie 1 (Klient przeniósł się z pokoju do pokoju), a godzina jest taka, kiedy transakcja ma miejsce. Jeśli klient zostanie następnie przeniesiony w przyszłości podczas jego istniejącego istniejącego pobytu, który zostanie zarejestrowany jako zdarzenie 9 (Klient przeniósł się z pokoju do innego pokoju), a wartości CurrentRoom
& * NewRoom
również zostaną zarejestrowane.
Problem
udało mi się uzyskać czas od poprzedniego wiersza i czas od następnego wiersza przy użyciu LAG i LEAD a następnie wypracować różnicę między dwa razy, co daje mi czas, który klient spędził w tym konkretnym pokoju.
Problem związany z używaniem LGD polega na uzyskaniu poprzedniej wartości, która w niektórych przypadkach może być wartością od zupełnie innego klienta. Chciałbym uzyskać LGD & prowadzić wartości tylko dla konkretnego CustomerID
& obecny VisitNumber
a następnie wypracować różnicę między wartościami, aby dowiedzieć się, jak długo, że klient spędził w pomieszczeniu.
Demo dane:
CREATE TABLE #beds
(
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[User] [nvarchar](50) NULL,
[CustomerID] [nvarchar](50) NULL,
[Area] [nchar](10) NULL,
[Event] [nvarchar](50) NULL,
[VisitNumber] [nvarchar](50) NULL,
[Time] [datetime] NULL,
[CurrentRoom] [nvarchar](50) NULL,
[NewRoom] [nvarchar](50) NULL
)
GO
INSERT INTO #beds ([User],[CustomerID],[Area],[Event],[VisitNumber],[Time],[CurrentRoom],[NewRoom])
VALUES ('00001','C11111111','Area1',2,111111111,'2017-03-22 11:05:44.360','B22','B44'),
('00001','C11111111','Area1',1,111111111,'2017-03-22 11:05:15.517','','B22'),
('00001','C22222222','Area2',1,222222222,'2017-03-22 07:38:16.117','','POD3'),
('00001','C22222222','Area2',3,222222222,'2017-03-22 07:41:24.787','POD3','POD3'),
('00001','C22222222','Area2',9,222222222,'2017-03-22 09:10:49.697','POD3',''),
('00001','C22222222','Area2',1,222222222,'2017-03-22 10:05:19.130','','POD15'),
('00001','C22222222','Area2',2,222222222,'2017-03-22 10:13:43.057','POD15','A'),
('00001','C22222222','Area2',3,222222222,'2017-03-22 10:25:01.527','A','A'),
('00001','C22222222','Area2',3,222222222,'2017-03-22 10:46:03.960','A','A'),
('00001','C22222222','Area2',3,222222222,'2017-03-22 10:46:17.030','A','A'),
('00002','C33333333','Area3',1,333333333,'2017-03-22 09:20:23.660','','B46'),
('00001','C33333333','Area2',9,333333333,'2017-03-22 08:53:32.860','POD8','POD1'),
('00001','C33333333','Area2',1,333333333,'2017-03-22 07:34:58.810','POD7','POD8'),
('00001','C33333333','Area2',1,333333333,'2017-03-22 11:49:55.203','','BB4'),
('00001','C33333333','Area2',3,333333333,'2017-03-22 11:50:11.943','BB4','BB4'),
('00001','C33333333','Area2',3,333333333,'2017-03-22 08:42:56.157','POD8','POD8'),
('00001','C33333333','Area2',3,333333333,'2017-03-22 08:22:59.157','POD8','POD8'),
('00003','C33333333','Area3',1,333333333,'2017-03-23 06:41:12.753','','B46')
GO
To jest kwerenda, że mam tak daleko; to da mi poprzednią wartość wiersza i wartość następnego rzędu, ale nie sądzę, że bierze pod uwagę klienta.
SELECT
T1.[User], T1.[CustomerID],
T1.[Area], T1.[Event],
T1.[VisitNumber],
T1.[CurrentRoom], T1.[NewRoom],
T1.[Time],
LAG(T1.TIME) OVER (ORDER BY T1.VisitNumber) PreviousTime,
LEAD(T1.TIME) OVER (ORDER BY T1.VisitNumber) NextTime
FROM
#beds t1
WHERE
T1.[Area] = 'Area2'
AND T1.[CurrentRoom] IS NOT NULL
AND T1.[NewRoom] IS NOT NULL
AND T1.[CustomerID] IS NOT NULL
AND T1.[CustomerID] <> ' '
AND T1.Event IN (1,9)
ORDER BY
VisitNumber DESC
Oczekiwany wynik: To oczekiwane wyjście. Chcę tylko TimeInRoom
(wyłączając pole daty od czasu):
+------------+-------+-------------+-------------+---------+------------+
| CustomerID | Area | VisitNumber | CurrentRoom | NewRoom | TimeInRoom |
+------------+-------+-------------+-------------+---------+------------+
|C33333333 |Area2 | 333333333 | | BB4 | 00:10 |
|C33333333 |Area2 | 333333333 | | POD8 | 00:20 |
|C33333333 |Area2 | 333333333 | POD8 | | 00:30 |
+------------+-------+-------------+-------------+---------+------------+
Jest to doskonały przykład tego, jak zadać dobre pytanie SQL. +1. –
Poza tym, że kolumny nie pasują do siebie ... – jarlh
@iamrichhowell: Jesteś pewien, że twoje przykładowe dane są spójne z twoim opisem? – etsa