Группировка SQL по посещениям - PullRequest
0 голосов
/ 12 июля 2019

Мы пытаемся определить количество времени для каждого визита. Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...