La Dimensión Minutos

16 10 2007

Muchas veces se requiere analizar la información en base al tiempo. Por ejemplo, desglosar las ventas por hora, por minuto o si ocurrieron en la mañana, tarde o noche. En otras palabras, requerimos una dimensión de tiempo, pero nó la de tiempo normal sinó una en base al minuto del día en el que transcurrieron las cosas.


CREATE TABLE Minutos (
MinutoID int NOT NULL,
Minuto varchar(50) null,
HoraID int NOT NULL,
Hora varchar(50) NULL,
ParteDelDiaID int NOT NULL,
ParteDelDia varchar(50) NULL,
PRIMARY KEY (MinutoID)
)

El anterior código es el create table para nuestra dimensión Minutos. La llave es el MinutoID, para esta llave yo siempre uso el minuto del día a partir de las cero horas. Así por ejemplo para las 5:30 uso 5*60+30=330 como llave.

Minutos

Un select sobre la tabla Minutos nos daría el anterior resultado. Minuto y Hora son varchar para dejar ahí la descripción de los minutos y hora. Como por ejemplo: «12:58» y «12:00»; «00:34» ó «01:00».

Esto se requiere para el order by, sobre todo cuando se quiere una gráfica hora por hora.

El código para llenar la tabla minutos es el siguiente:

Declare @Fecha datetime

set @Fecha = ‘2007-01-01 00:00:00’
while @fecha < = '2007-01-01 23:59:00' begin insert into minutos select datepart( hh, @fecha)*60+datepart(mi, @fecha) as MinutoID, left(convert( varchar, @fecha, 108),5) as Minutos, datepart( hh, @fecha) as HoraID, left(convert( varchar, @fecha, 108),3)+'00' as Hora, case when datepart( hh, @fecha) between 0 and 12 then 1 when datepart( hh, @fecha) between 13 and 19 then 2 else 3 end as ParteDelDiaID, case when datepart( hh, @fecha) between 0 and 6 then 'Madrugada' when datepart( hh, @fecha) between 6 and 11 then 'MaÃ�±ana' when datepart( hh, @fecha) between 12 and 19 then 'Tarde' else 'Noche' end as ParteDelDia set @Fecha=dateadd( mi, 1, @fecha) end [/sourcecode] La tabla únicamente guarda los 1440 minutos del día, nó mas. Con esta tabla como parte de la estrella ahora sería posible hacer querys como estos: [sourcecode language='sql'] select hora, sum( NumeroTransacciones) from dbo.FactProcessesPerspective a join Tiempo b on a.tiempoid = b.tiempoid join Minutos c on a.MinutoID = c.MinutoID where b.Mes = '2007-01' group by hora[/sourcecode]o en vez de hora usar el campo ParteDelDia y así tendría cual fué el número de transacciones en la mañana, tarde o noche. Por cierto, esta tabla es algo indispensable para un cubo de delicuencia.

Technorati tags: ,


Acciones

Information

4 responses

30 01 2009
Sandra

Adrian,, muchas gracias por tu respuesta.

que buen blog,,,, felicitaciones.

13 12 2010
Juan Carlos

Hola tengo una duda, estoy manejando una dimsion de geografia, que tiene las jerarquias de Municipio y Colonia. Pero deseo en algun momento mostrar los detalles como la direccion y el telefono, siendo que estos generalmente no se pueden agrupar . En donde puedo poner esos datos? en la dimension de geografia o en la tabla Hechos? Estoy ocupando SQL server 2005.

Saludos y gracias

13 12 2010
Adrian

estas mas bien son propiedades, y me suenan mas a propiedades del cliente o sujeto, no tanto de la geografia. Tal vez algun visitante de por aqui nos pueda hechar la mano diciendonos como aadirlas

1 07 2011
Jorge Estrada

Hola Adrian, buenas tardes, estoy haciendo un cubo en donde precisamente hay que hacer analisis de ventas por hora, viendo el ejemplo que publicaste me queda duda si esta tabla minutos que sugieres es otra tabla diferente a la tabla de dimension tiempo de tu cubo o es mas conveniente tener una columna hora en tu tabla de dimension tiempo?
Gracias por tu ayuda, saludos cordiales

Deja un comentario