Мы пытаемся определить количество времени для каждого визита. Используя LAG и LEAD, я могу определить, когда читается тег для нового посещения. Первое чтение для посещения обозначено N / A в столбце lRead
. Последнее чтение для посещения обозначено N / A в столбце nRead
. Я хотел бы подсчитать число чтений для каждого посещения (сгруппируйте первое чтение до последнего чтения в группу, обозначенную N / A).
dataRead
данные таблицы
tagID | locID | direction | laneGroup | messageTime
-------+-------+-----------+-------------+-------------
466 | T18 | In | InSecurity | 7:54 AM
466 | T18 | In | InOffice | 7:59 AM
466 | T18 | Out | OutOffice | 8:37 AM
466 | T18 | Out | OutSecurity | 8:38 AM
466 | T18 | Out | OutSecurity | 8:39 AM
466 | T18 | In | InSecurity | 3:06 PM
466 | T18 | Out | OutSecurity | 3:26 PM
466 | T18 | Out | OutSecurity | 3:27 PM
466 | T18 | In | InSecurity | 3:35 PM
466 | T18 | Out | OutOffice | 3:58 PM
466 | T18 | Out | OutSecurity | 4:02 PM
466 | T18 | Out | OutSecurity | 4:03 PM
Ниже приведен SQL, который мне нужен, чтобы помочь мне определить новые посещения со значениями N / A в следующих столбцах чтения и последнего чтения.
WITH Level1 -- Get the data
AS ( SELECT
tagID,
locID,
direction,
laneGroup,
messageTime,
LAG(direction, 1, 'N/A')
OVER ( PARTITION BY CONCAT(tagID,locID)
ORDER BY messageTime) AS lRead,
LEAD(direction, 1, 'N/A')
OVER ( PARTITION BY CONCAT(tagID,locID)
ORDER BY messageTime) AS nRead
FROM
dataRead
Level2 -- Identify end of visit and beginning of new visit
AS ( SELECT
tagID,
locID,
direction,
laneGroup,
messageTime,
CASE WHEN direction = 'In' AND lRead= 'Out' THEN 'N/A' ELSE lRead
END lRead,
CASE WHEN direction = 'Out' AND nRead= 'In' THEN 'N/A' ELSE nRead
END nRead
FROM
Level1
),
Level3 -- Get times
AS ( SELECT
tagID,
mtoID,
direction,
laneGroup,
messageTime,
lRead,
nRead,
CASE
WHEN nextEvent = 'N/A' THEN NULL
ELSE DATEDIFF(SECOND, messageTime,
LEAD(messageTime)
OVER ( PARTITION BY CONCAT(tagID,mtoID)
ORDER BY messageTime ))
END AS toSeconds,
CASE
WHEN lastEvent = 'N/A' THEN NULL
ELSE DATEDIFF(SECOND, messageTime,
LAG(messageTime)
OVER ( PARTITION BY CONCAT(tagID,mtoID)
ORDER BY messageTime )) * -1
END AS fromSeconds
FROM Level2
)
SELECT
ROW_NUMBER() OVER (PARTITION BY CONCAT(tagID,mtoID) ORDER BY messageDateTime) as dReads,
tagID,
locID,
laneGroup,
lRead,
nRead,
toSeconds,
fromSeconds
FROM
Level3
ORDER BY
mtoID,
tagID,
messageTime;
Я хотел бы сгруппировать каждое посещение и подсчитывать число чтений для каждого посещения (мне нужен SQL для создания столбца visitCnt).
dReads | tagID | locID | laneGroup | lRead | nRead | visitCnt
--------+-------+-------+-------------+-------+-------+----------
1 | 466 | T18 | InSecurity | N/A | In | 1
2 | 466 | T18 | InOffice | In | Out | 2
3 | 466 | T18 | OutOffice | In | Out | 3
4 | 466 | T18 | OutSecurity | Out | Out | 4
5 | 466 | T18 | OutSecurity | Out | N/A | 5
6 | 466 | T18 | InSecurity | N/A | Out | 1 <-- New Visit
7 | 466 | T18 | OutSecurity | In | Out | 2
8 | 466 | T18 | OutSecurity | Out | N/A | 3
9 | 466 | T18 | InSecurity | N/A | Out | 1 <-- New Visit
10 | 466 | T18 | OutOffice | In | Out | 2
11 | 466 | T18 | OutSecurity | Out | Out | 3
12 | 466 | T18 | OutSecurity | Out | N/A | 4