(mssql) Как я могу добавить дополнительные столбцы в извлеченных данных - PullRequest
0 голосов
/ 05 июля 2018

у меня есть этот код ниже (работает на SQL Server 2017):

WITH selection AS (
    SELECT servertimestamp 
    FROM eventlog 
    WHERE servertimestamp BETWEEN '5/29/2018' AND DATEADD(dd, +1, '6/29/2019')

    AND (attributes LIKE '%N<=>PeopleIn%'))
(SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0) as timestamp , COUNT(servertimestamp) AS GONE_OUT
FROM selection
WHERE DATEPART(hh, servertimestamp) BETWEEN 8 AND 20

GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0))
ORDER BY timestamp

Также на скриншоте ниже показан результат выполненного кода:

enter image description here

То, что делает этот код, показывает, сколько людей заходило в здание каждый день. Данные сгруппированы за 2 часа.

Что я хочу сделать, так это добавить столбец, который показывает, сколько людей вышло из здания за те же временные интервалы, которые я уже использую. Ниже я приведу пример того, что я хочу сделать:

enter image description here

Обратите внимание, что в 6-й строке я использую оператор LIKE ( атрибуты LIKE '% N <=> PeopleIn%' ). Это означает, что для дополнительного столбца мне придется делать аналогичные выборы, но с разницей в использовании атрибутов LIKE '% N <=> PeopleOut%' .

Могу ли я сделать это с помощью оператора UNION? Есть ли другой более очевидный или более простой способ сделать это?

Ваша помощь будет оценена по достоинству, спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы можете сделать это путем сортировки меток поля servertimestamp в вашем CTE на основе действия, а затем суммировать метки.

WITH selection
AS (
  SELECT 
    servertimestamp
    ,CASE WHEN attributes LIKE '%N<=>PeopleIn%' THEN 1 ELSE 0 END AS PPL_IN
    ,CASE WHEN attributes LIKE '%N<=>PeopleOut%' THEN 1 ELSE 0 END AS PPL_OUT
  FROM eventlog
  WHERE 
    servertimestamp BETWEEN '5/29/2018' AND DATEADD(dd, + 1, '6/29/2019')
    AND 
    (attributes LIKE '%N<=>PeopleIn%'
     OR
     attributes LIKE '%N<=>PeopleOut%')
  ) 
  (
    SELECT 
      DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0) AS TIMESTAMP
      ,SUM(PPL_OUT) AS GONE_OUT
      ,SUM(PPL_IN) AS CAME_IN
    FROM selection
    WHERE DATEPART(hh, servertimestamp) BETWEEN 8
        AND 20
    GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0)
   )
ORDER BY TIMESTAMP
0 голосов
/ 05 июля 2018

UNION добавляет результирующие наборы в порядке выполнения. UNION не будет моим первым выбором в решении этой проблемы.

На скриншоте я вижу, что GONE_OUT и CAME_IN сгруппированы по уникальному времени и категории, по которой сгруппированы агрегированные значения. У вас может быть два (под) запроса, один для GONE_OUT и один для CAME_IN, а затем построить отношение.

SELECT *
FROM GONE_OUT AS go 
LEFT JOIN CAME_IN AS ci ON go.timestamp = ci.timestamp
...