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
[/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: 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 aadirlas
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