2009-04-16 19 views
11

Tengo una tabla con marcas de tiempo. ¿Cuál es la consulta adecuada para obtener el conteo de registros para cada minuto durante la última hora?TS SQL - grupo por minuto

I.e. si ahora es 2:25, quiero saber cuántos registros fueron entre 1:25 y 1:26, 1:26 y 1:27, y así sucesivamente, así que tengo 60 resultados.

Respuesta

19

Esto devolverá un recuento de los resultados para cada minuto (donde se tiene registros) en la última hora

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) 

Esto puede devolver menos de 60 resultados, dependiendo de los datos. Si tiene que tener 60 resultados, la consulta es ligeramente diferente. Este utiliza una expresión de tabla común para generar una lista de 60 números y una sub-consulta correlacionada para obtener los resultados de cada minuto:

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 

Para ver los resultados, reemplace DATEADD (hh, -1, GETDATE()) con DATEADD (mi, -15, GETDATE()) y obtendrás los resultados de los últimos 15 minutos y 0 para otros minutos.

+0

parece correcto, gracias. –

+0

Me alegra ayudar. ¿Necesita garantizar que la consulta devuelva 60 registros cada vez? –

+0

no, no hay necesidad, gracias –

-1

SELECT COUNT (TS) de la tabla donde TABLE.TS ENTRE (starttime, tiempo final)

+0

Gracias, pero esto me dará la cuenta total, o tengo que ejecutarlo 60 veces. Necesito una consulta para darme los totales de cada minuto. –

3

Como se ha editado la pregunta, editar mi respuesta. Si le he entendido bien, quiere mirar solo la hora pasada, es decir, un intervalo de tiempo desde una hora antes de que se realice la solicitud hasta la hora actual. Así es como lo haría:

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

No estoy del todo seguro de que la sintaxis es exacta. Al codificar en MSSQL, usaría el CURRENT_TIMESTAMP para la hora actual, MINUTE en lugar de DATEPART, etc., pero se obtiene la idea de la solución.

+0

+1 para la respuesta. no es exactamente lo que necesito, así que volveré a formular la pregunta. Gracias. –

+0

Además, no hay HORA Y MINUTO, pero DATEPART. –

2

DATEPART es lo que está buscando:

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 

Resultado:

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

Esto es mejor que la respuesta de Tomas porque usa Hour() o el equivalente porque el resultado sería engañoso cuando el conjunto de datos tenía más de un día. Solo recuerde que between es inclusivo, a menudo es mejor en estos casos decir alguna vez> = lower y alguna vez rfusca

+0

Mi punto fue, obviamente, que todas las partes de las fechas que deben considerarse por separado deben tenerse en cuenta. Acabo de escribir la Hora como un ejemplo, y pensé que era obvio que el día, el mes y el año también deben considerarse. –

0

Esta es una alternativa que he encontrado útil para determinar cuántos registros se insertan o se actualizan por minuto. Lo bueno de tener su formato de fecha como una variable por adelantado es que puede cambiarlo fácilmente para analizar por hora en su lugar. ¡Espero que esto ayude!

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