мс sql группа по 2 часа - PullRequest
       14

мс sql группа по 2 часа

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

у меня есть этот код MS-SQL ниже, работающий на сервере sql 2017:

DECLARE @report_int TABLE
(
  atimestamp DATETIME,
  adate DATE,
  ahour INT,
  intvalue INT,
  attribute CHAR(254),
  total INT
)

INSERT INTO @report_int
SELECT
  el.servertimestamp,
  cast(el.servertimestamp as date) adate,
  (DATEPART(HH,el.servertimestamp)) ahour,
  el.intvalue,
  el.attributes,
  0
FROM
  eventlog el
where
  el.servertimestamp  BETWEEN '6/29/2017'
                  AND DATEADD(dd, +1, '6/29/2019')
  and (attributes LIKE '%N<=>OlympieioIn%' OR attributes LIKE '%N<=>OlympieioOut%')
order by
  el.servertimestamp

DECLARE @report TABLE
(
  adate datetime,
  ahour int,
  came_in bigint,
  gone_out bigint

)

--fill report with dates and hours
INSERT INTO @report (adate, ahour) SELECT DISTINCT adate, ahour FROM @report_int

--reset
UPDATE @report set came_in = 0, gone_out = 0

--update in totals, min and max times
UPDATE @report SET came_in = i.total from
@report r,
(
select adate, ahour, COUNT(*) total
FROM @report_int
WHERE attribute LIKE 'N<=>OlympieioIn'
GROUP BY adate, ahour
) i
WHERE
i.adate = r.adate
and i.ahour = r.ahour

--update out totals
UPDATE @report SET gone_out = i.total from
@report r,
(
SELECT adate, ahour, COUNT(*) total
FROM @report_int
WHERE attribute LIKE 'N<=>OlympieioOut'
GROUP BY adate, ahour
) i
where
i.adate = r.adate
and i.ahour = r.ahour

select
  adate,
  ahour,
  RIGHT('00'+cast(ahour as varchar),2)+':00 - '+RIGHT('00'+cast(ahour+1 as varchar),2)+':00' timeframe,
  came_in,
  gone_out
from
  @report 

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

Here is the link where you can see the screenshot

То, что я хочу сделать, это сгруппировать эти данные в 2-часовую группировку. Например, группировка 3-го и 4-го часа выполненного кода, приведенного выше, будет:

ДАТА (adate): 2018-05-12 час (ачур): 15 Сроки: 15: 00-17: 00 came_in: 0 ушел_ 2

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

спасибо.

Ответы [ 2 ]

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

Один из способов получения даты и времени для последнего 2-часового интервала будет использовать:

DATEADD(HOUR, DATEDIFF(HOUR, 0, YourDateColumn) - (DATEDIFF(HOUR, 0, YourDateColumn) % 2), 0)

Если мы затем возьмем некоторые (случайные) выборочные данные, вы получите следующее:

WITH VTE AS (
    SELECT CONVERT(datetime2(0),V.DT) AS DT
    FROM (VALUES('2018-07-04T00:11:32'),('2018-07-04T01:17:12'),('2018-07-04T02:00:01'),('2018-07-04T07:49:59'),('2018-07-04T07:59:58'),('2018-07-04T08:00:00')) V(DT))
SELECT DT, DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0) AS DT2h
FROM VTE;

Что возвращает:

DT                          DT2h
--------------------------- -----------------------
2018-07-04 00:11:32         2018-07-04 00:00:00.000
2018-07-04 01:17:12         2018-07-04 00:00:00.000
2018-07-04 02:00:01         2018-07-04 02:00:00.000
2018-07-04 07:49:59         2018-07-04 06:00:00.000
2018-07-04 07:59:58         2018-07-04 06:00:00.000
2018-07-04 08:00:00         2018-07-04 08:00:00.000

Если вы хотите использовать интервал COUNT на 2 часа:

WITH VTE AS (
    SELECT CONVERT(datetime2(0),V.DT) AS DT
    FROM (VALUES('2018-07-04T00:11:32'),('2018-07-04T01:17:12'),('2018-07-04T02:00:01'),('2018-07-04T07:49:59'),('2018-07-04T07:59:58'),('2018-07-04T08:00:00')) V(DT))
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0) AS DT2h, COUNT(DT) AS C
FROM VTE
GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0);

Что возвращает:

DT2h                    C
----------------------- -----------
2018-07-04 00:00:00.000 2
2018-07-04 02:00:00.000 1
2018-07-04 06:00:00.000 2
2018-07-04 08:00:00.000 1
0 голосов
/ 04 июля 2018

Я бы просто вручную создал расписание и присоединился к нему. Расписание будет иметь 24 строки (по одному на каждый час) и может выглядеть так: час часовой таймфрейм 13 13:00 - 14:00 13:00 - 15:00

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...