TS SQL - группа по минутам - PullRequest
14 голосов
/ 17 апреля 2009

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

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

Ответы [ 5 ]

21 голосов
/ 17 апреля 2009

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

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

3 голосов
/ 17 апреля 2009

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

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

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

2 голосов
/ 17 апреля 2009

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
1 голос
/ 21 мая 2016

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

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
0 голосов
/ 17 апреля 2009

ВЫБЕРИТЕ COUNT (TS) из TABLE, где TABLE.TS МЕЖДУ (время начала, время окончания)

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