Friday, December 10, 2010

SQL: agrupar registros por un intervalo arbitrario

Recientemente, un compañero me presento un problema, necesitaba escribir un query que agrupara registros por intervalos de 5,10,15 minutos, idealmente queria que se pudiera pasar un parametro al query para especificar el intervalo, despues de unos minutos di con la solucion:

declare @interval int

set @interval = 5
select datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval
, count(*)
from thetable
group by datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval

El truco esta en @interval*@interval, aunque parece que la division y multiplicacion se eliminan entre si, lo que realmente pasa ahi es una division entera, la cual al multiplicarla por el mismo valor, nos da los intervalos correctos.

He aqui una lista de valores generados para un intervalo de 5

minuto|dividido por 5|multiplicado por 5
0 | 0 | 0
1 | 0 | 0
...
5 | 1 | 5
6 | 1 | 5
...
10 | 2 | 10
11 | 2 | 10
...
Teniendo esto se pueden agregar mas campos al select, o hacer la presentacion del tiempo mas bonito, etc

declare @interval int
set @interval = 5
select convert(varchar(8), DTColumn, 1)+' '
      +convert(varchar(2), datepart(hh, DTColumn))+':'
      +convert(varchar(2), datepart(mi, DTColumn)/@interval*@interval)
, count(*)
from the_table
group by convert(varchar(8), DTColumn, 1)+' '
      +convert(varchar(2), datepart(hh, DTColumn))+':'

      +convert(varchar(2), datepart(mi, DTColumn)/@interval*@interval)


Esto nos da algo asi:

11/12/10 10:10    28

11/12/10 10:15    11

11/12/10 10:20    57

Espero le sea de utilidad a alguien

1 comment:

derreiter said...

Muchas gracias, tengo una consulta parecida, no seria igual, pero me acabas de dar una idea bastante buena sobre como hacerlo... gracias!!!