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 (время начала, время окончания)