TS SQL - группа за минуту

У меня есть таблица с отметками времени. Каков правильный запрос для подсчета количества записей за каждую минуту в течение последнего часа.

т.е. если сейчас 2:25, я хочу знать, сколько записей было между 1:25 и 1:26, 1:26 и 1:27, и так далее, поэтому у меня есть 60 результатов.

Ответ 1

Это вернет количество результатов за каждую минуту (где у вас есть записи) за последний час

SELECT DATEPART(n, time_stamp) AS minute, COUNT(*) as results
FROM table_name 
WHERE time_stamp > DATEADD(hh, -1, GETDATE())
GROUP BY DATEPART(n, time_stamp)

Это может вернуть менее 60 результатов в зависимости от данных. Если у вас должно быть 60 результатов, запрос немного отличается. Это использует выражение Common Table для генерации списка из 60 чисел и коррелированного подзапроса для получения результатов за каждую минуту:

WITH numbers ( num ) AS (
    SELECT 1 UNION ALL
    SELECT 1 + num FROM numbers WHERE num < 60 )
SELECT num AS minute,
    (SELECT COUNT(*) AS results
    FROM table_name
    WHERE DATEPART(n, time_stamp) = num
    AND time_stamp > DATEADD(hh, -1, GETDATE())
FROM numbers

Чтобы увидеть результаты, замените DATEADD (hh, -1, GETDATE()) на DATEADD (mi, -15, GETDATE()), и вы получите результаты за последние 15 минут и 0 за другие минуты.

Ответ 2

Как вы отредактировали вопрос, я отредактировал свой ответ. Если я правильно вас понял, вы хотите посмотреть только на прошлый час - то есть, период времени от одного часа до того, как запрос будет сделан в текущее время. Вот как я это сделаю:

SELECT
    COUNT(yourTimeStamp)
FROM yourTable
WHERE DATEADD('hh', -1, GetDate()) <= yourTimeStamp 
    AND yourTimeStamp < GetDate()
GROUP BY DATEPART('mm', yourTimeStamp)

Я не совсем уверен, что синтаксис точнее. При кодировании в MSSQL я использовал бы CURRENT_TIMESTAMP для текущего времени, MINUTE вместо DATEPART и т.д., Но вы получите идею для решения.

Ответ 3

DATEPART - это то, что вы ищете:

declare @times table
(
    someTime datetime
)

INSERT INTO @Times (sometime) values ('jan 12 2008 12:23')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:34')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:35')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:25')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:02')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:09')
INSERT INTO @Times (sometime) values ('jan 12 2008 12:35')


select DATEPART(mi,sometime) AS Minute, count(*) AS NumOccurances
from @Times
WHERE SomeTime BETWEEN @Lower AND @Upper
GROUP BY DATEPART(mi, sometime)
order by NumOccurances DESC

Результат:

Minute  NumOccurances
35  2
2   1
9   1
23  1
25  1
34  1

Ответ 4

Это альтернатива, которую я нашел полезной для определения того, сколько записей вставлено или обновлено за минуту. Самое приятное в том, что формат даты в качестве переменной впереди - это то, что вы можете легко ее изменить для анализа в час вместо этого. Надеюсь, это поможет!

DECLARE @dateFormat as varchar(max) = 'yyyy-MM-dd HH:mm'

SELECT format(timeColumn, @dateFormat) AS minute, COUNT(*) as results
FROM yourTable
WHERE timeColumn > DATEADD(hh, -1, GETDATE())
GROUP BY  format(timeColumn, @dateFormat)
ORDER BY 1

Ответ 5

SELECT COUNT (TS) из таблицы, где TABLE.TS BETWEEN (время начала, время окончания)