- Versión para impresión
- Inicie sesión para enviar comentarios
En un data warehouse hay una serie de dimensiones comunes como son la geografica y la de tiempo. Para quién le pueda servir de ayuda dejo aquí el script de creación de la dimensión tiempo y un procedimiento para hacer la carga entre fechas de la tabla:
/*Base de datos destino*/ use PAnalisys /*Creación de la tabla*/ create table DIM_TIEMPO ( FechaSK int not null, Fecha date not null, Año smallint not null, Trimestre smallint not null, Mes smallint not null, Semana smallint not null, Dia smallint not null, DiaSemana smallint not null, NTrimestre char(7) not null, NMes char(15) not null, NMes3L char(3) not null, NSemana char(10) not null, NDia char(6) not null, NDiaSemana char(10) not null constraint PK_DIM_TIEMPO PRIMARY KEY CLUSTERED ( Fecha asc ) ) /*Script de carga*/ DECLARE @FechaDesde as smalldatetime, @FechaHasta as smalldatetime DECLARE @FechaAAAAMMDD int DECLARE @Año as smallint, @Trimestre char(2), @Mes smallint DECLARE @Semana smallint, @Dia smallint, @DiaSemana smallint DECLARE @NTrimestre char(7), @NMes char(15) DECLARE @NMes3l char(3) DECLARE @NSemana char(10), @NDia char(6), @NDiaSemana char(10) --Set inicial por si no coincide con los del servidor SET DATEFORMAT dmy SET DATEFIRST 1 BEGIN TRANSACTION --Borrar datos actuales, si fuese necesario --TRUNCATE TABLE FROM DI_TIEMPO --RAngo de fechas a generar: del 01/01/2006 al 31/12/Año actual+2 SELECT @FechaDesde = CAST('20060101' AS smalldatetime) SELECT @FechaHasta = CAST(CAST(YEAR(GETDATE())+2 AS CHAR(4)) + '1231' AS smalldatetime) WHILE (@FechaDesde <= @FechaHasta) BEGIN SELECT @FechaAAAAMMDD = YEAR(@FechaDesde)*10000+ MONTH(@FechaDesde)*100+ DATEPART(dd, @FechaDesde) SELECT @Año = DATEPART(yy, @FechaDesde) SELECT @Trimestre = DATEPART(qq, @FechaDesde) SELECT @Mes = DATEPART(m, @FechaDesde) SELECT @Semana = DATEPART(wk, @FechaDesde) SELECT @Dia = RIGHT('0' + DATEPART(dd, @FechaDesde),2) SELECT @DiaSemana = DATEPART(DW, @FechaDesde) SELECT @NMes = DATENAME(mm, @FechaDesde) SELECT @NMes3l = LEFT(@NMes, 3) SELECT @NTrimestre = 'T' + CAST(@Trimestre as CHAR(1)) + '/' + RIGHT(@Año, 2) SELECT @NSemana = 'Sem ' +CAST(@Semana AS CHAR(2)) + '/' + RIGHT(RTRIM(CAST(@Año as CHAR(4))),2) SELECT @NDia = CAST(@Dia as CHAR(2)) + ' ' + RTRIM(@NMes) SELECT @NDiaSemana = DATENAME(dw, @FechaDesde) INSERT INTO PAnalisys.dbo.DIM_TIEMPO ( FechaSK, Fecha, Año, Trimestre, Mes, Semana, Dia, DiaSemana, NTrimestre, NMes, NMes3L, NSemana, NDia, NDiaSemana ) VALUES ( @FechaAAAAMMDD, @FechaDesde, @Año, @Trimestre, @Mes, @Semana, @Dia, @DiaSemana, @NTrimestre, @NMes, @NMes3l, @NSemana, @NDia, @NDiaSemana ) --Incremento del bucle SELECT @FechaDesde = DATEADD(DAY, 1, @FechaDesde) END COMMIT TRANSACTION
A partir de aquí cada uno puede modificarla a su gusto añadiendo o quitando atributos
MySQL
Subido por bernabeu_dario el 29 Julio, 2009 - 17:31
Excelente aporte!
Hacia rato que tenía ganas de mostrar un ejemplo de la estructura de la dimensión tiempo y cómo realizar la carga de la misma, así que aproveché tu post para crear una entrada en mi blog, en donde básicamente traduje lo que tú has hecho en MySQL.
Gracias por compartir. Saludos!
Lo mismo digo
Subido por il_masacratore el 30 Julio, 2009 - 09:14
En respuesta a MySQL por bernabeu_dario
Lo mismo digo bernabeu_dario!!
Script
Subido por Juan Pablo Lastra (no verificado) el 16 Marzo, 2010 - 03:37
Muy buen ejemplo...
Error el implementar Jerarquia en SSAS
Subido por Oscar López Osorio el 24 Julio, 2011 - 10:18
Buenos días, estimados
Los saludo desde el Edo. De México, México.
Primero que nada gracias por compartir el script, les comento que al intentar implementar una jerarquía de la dimensión tiempo con la siguientes estructura:
Año -> NTrimestre -> NMes en Analysis Services 2008 se produce el siguiente error:
Errors in the OLAP storage engine: A duplicate attribute key has been found when processing: Table: 'dbo_Dim_Tiempo', Column: 'NMes', Value: 'Diciembre'. The attribute is 'N Mes'.
Al parecer es porque los meses no son distintos entre cada año, para solucionarlo hice unos pequeños cambios a su script y le agregue el campo semestre, el cual les comparto:
/*Creación de la tabla*/ create table Dim_Tiempo ( FechaSK int not null, Fecha date not null, Anio smallint not null, Semestre smallint not null, Trimestre smallint not null, Mes smallint not null, Semana smallint not null, Dia smallint not null, DiaSemana smallint not null, NSemestre char(7) not null, NTrimestre char(7) not null, NMes char(15) not null, NMes3L char(6) not null, NSemana char(10) not null, NDia char(6) not null, NDiaSemana char(10) not null constraint PK_DIM_TIEMPO PRIMARY KEY CLUSTERED ( Fecha asc ) ) /*Script de carga*/ DECLARE @FechaDesde as smalldatetime, @FechaHasta as smalldatetime DECLARE @FechaAAAAMMDD int DECLARE @Año as smallint, @Semestre char(2), @Trimestre char(2), @Mes smallint DECLARE @Semana smallint, @Dia smallint, @DiaSemana smallint DECLARE @NSemestre char(7), @NTrimestre char(7), @NMes char(18) DECLARE @NMes3l char(6) DECLARE @NSemana char(10), @NDia char(6), @NDiaSemana char(10) --Set inicial por si no coincide con los del servidor SET DATEFORMAT dmy SET DATEFIRST 1 BEGIN TRANSACTION --Borrar datos actuales, si fuese necesario --TRUNCATE TABLE FROM DI_TIEMPO --RAngo de fechas a generar: del 01/01/2006 al 31/12/Año actual+2 SELECT @FechaDesde = CAST('20060101' AS smalldatetime) SELECT @FechaHasta = CAST(CAST(YEAR(GETDATE())+2 AS CHAR(4)) + '1231' AS smalldatetime) WHILE (@FechaDesde <= @FechaHasta) BEGIN SELECT @FechaAAAAMMDD = YEAR(@FechaDesde)*10000+ MONTH(@FechaDesde)*100+ DATEPART(dd, @FechaDesde) SELECT @Año = DATEPART(yy, @FechaDesde) SELECT @Trimestre = DATEPART(qq, @FechaDesde) SELECT @Semestre = CASE WHEN @Trimestre <= 2 THEN 1 ELSE 2 END SELECT @Mes = DATEPART(m, @FechaDesde) SELECT @Semana = DATEPART(wk, @FechaDesde) SELECT @Dia = RIGHT('0' + DATEPART(dd, @FechaDesde),2) SELECT @DiaSemana = DATEPART(DW, @FechaDesde) SELECT @NMes = DATENAME(mm, @FechaDesde) + '/' + RIGHT(@Año, 2) SELECT @NMes3l = LEFT(@NMes, 3) + '/' + RIGHT(@Año, 2) SELECT @NSemestre = 'S' + CAST(@Semestre as CHAR(1)) + '/' + RIGHT(@Año, 2) SELECT @NTrimestre = 'T' + CAST(@Trimestre as CHAR(1)) + '/' + RIGHT(@Año, 2) SELECT @NSemana = 'Sem ' +CAST(@Semana AS CHAR(2)) + '/' + RIGHT(RTRIM(CAST(@Año as CHAR(4))),2) SELECT @NDia = CAST(@Dia as CHAR(2)) + ' ' + RTRIM(@NMes) SELECT @NDiaSemana = DATENAME(dw, @FechaDesde) INSERT INTO dbo.DIM_TIEMPO ( FechaSK, Fecha, Anio, Semestre, Trimestre, Mes, Semana, Dia, DiaSemana, NSemestre, NTrimestre, NMes, NMes3L, NSemana, NDia, NDiaSemana ) VALUES ( @FechaAAAAMMDD, @FechaDesde, @Año, @Semestre, @Trimestre, @Mes, @Semana, @Dia, @DiaSemana, @NSemestre, @NTrimestre, @NMes, @NMes3l, @NSemana, @NDia, @NDiaSemana ) --Incremento del bucle SELECT @FechaDesde = DATEADD(DAY, 1, @FechaDesde) END COMMIT TRANSACTIONUn saludo…
OLO
Muchas gracias por tu
Subido por AnaMaria (no verificado) el 29 Octubre, 2013 - 21:15
Hola, estoy intentando hacer
Subido por AnaMaria (no verificado) el 30 Octubre, 2013 - 13:06
Una pregunta corta, he ido a
Subido por AnaMaria (no verificado) el 30 Octubre, 2013 - 13:08
Cuál es la sentencia que te
Subido por Carlos el 30 Octubre, 2013 - 23:12
En respuesta a Una pregunta corta, he ido a por AnaMaria (no verificado)
ya me funcionó! El ejemplo de
Subido por AnaMaria (no verificado) el 7 Noviembre, 2013 - 02:22
Bueno el ejemplo. Pero veo
Subido por Javier (no verificado) el 23 Enero, 2015 - 20:54
Bueno el ejemplo. Pero veo que el primer dia de la semana es Monday.¿Que tengo que hacer para que el primer dia de la semana sea Sunday?
Saludos,
Javier Vega.
Buenas Javier, cómo estás?
Subido por bernabeu_dario el 16 Febrero, 2015 - 16:31
En respuesta a Bueno el ejemplo. Pero veo por Javier (no verificado)
Buenas Javier, cómo estás?
En MySQL puedes hacer algo como:
dayofweek('2015-02-16')-1
Sino podrías emplear un CASE.
Saludos