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.
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
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:
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 horao 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: data warehousing, diseño

Adrian,, muchas gracias por tu respuesta.
que buen blog,,,, felicitaciones.
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
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 añadirlas
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