Blog

La Data Web

Un espacio para compartir ideas, tutoriales, automatizaciones y experiencias reales de trabajo con plataformas de datos y analítica. Artículos y notas sobre datos, Power BI, Fabric, Azure y automatización.

[Data Modeling] ¿Como hago una Tabla Fecha?

Durante el desarrollo de un modelo Bi es indispensable contar con una tabla fecha. Aun en las diferentes teorías de bi la importancia de una tabla que nos congregue día a día las filas con columnas de años, mes, semana, trimestre, etc. a disponibilidad de uso es crítico para un buen desarrollo de tableros o end user bi. Hoy en día, en microsoft particularmente, los modelos tabulares son un lugar indispensable para tener una tabla fecha. Los mismos traen gran capacidad de funciones de fecha para cálculos complejos en dax. Estos cálculos los denominan Time Intelligence. Para no desviarnos más con el tema vamos a ver como y donde puedo crear esta tabla.

SQL Server
Podemos generar un procedimiento almacenado que corra para reconstruirla durante las noches o en cada llamada de la actualización del modelo tabular. 

Tengamos en cuenta que el SELECT solo retorna una tabla de una columna con fechas desde hasta que hayamos seteado. Vamos a ver el panorama completo, luego cada quien separará en un procedimiento almacenado o lo usará de consulta directa.

CREATE TABLE dim_date
(
 [date]       DATE PRIMARY KEY,
 [year]       AS DATEPART(YEAR,     [date]),
 [month]      AS DATEPART(MONTH,    [date]),
 [MonthName]  AS DATENAME(MONTH,    [date]),
 [day]        AS DATEPART(DAY,      [date]),  
 FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),  
 FirstOfYear  AS CONVERT(DATE, DATEADD(YEAR,  DATEDIFF(YEAR,  0, [date]), 0)),
 [week]       AS DATEPART(WEEK,     [date]),
 [ISOweek]    AS DATEPART(ISO_WEEK, [date]),
 [DayOfWeek]  AS DATEPART(WEEKDAY,  [date]),
 [quarter]    AS DATEPART(QUARTER,  [date]),    
 [datekey]    AS CONVERT(CHAR(8),   [date], 112),
 [dmy]        AS CONVERT(CHAR(10),  [date], 101)
);

Procedimiento:

TRUNCATE TABLE dim_date

SET DATEFORMAT dmy;
SET LANGUAGE Spanish;DECLARE @StartDate DATE = '20000101'
DECLARE @CutoffDate DATE = GETDATE()+1 INSERT #dim([date])
SELECT d
FROM
(
SELECT d = DATEADD(DAY, rn - 1, @StartDate)
FROM
(
  SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
    rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
  FROM sys.all_objects AS s1
  CROSS JOIN sys.all_objects AS s2
  -- on my system this would support > 5 million days
  ORDER BY s1.[object_id]
) AS x
) AS y;SELECT * FROM dim_date

Power Query
No siempre tendremos la posibilidad de nutrirnos de un acceso de escritura a una base de datos para poder armar la tabla fecha de la primera forma mencionada, sino que a veces vamos a tener que terminar el data modeling incorporando la fecha en la etapa de capa semántica junto al modelo tabular. Éste método es el más usado en mi opinión si construimos Bi como servicio a entidades. Lo más atractivo es tener una tabla fecha resulta antes de cargar y aplicar el modelo tabular. 

Tengamos en cuenta que la fecha de inicio esta seteada a mano hasta fecha actual igual que en SQL.

= let
//Set start date
   StartDate = #date(2010, 1, 1),
   EndDate = DateTime.Date(DateTime.LocalNow()),
//Get the number of dates that will be required for the table
   GetDateCount = Duration.Days(EndDate - StartDate),
//Take the count of dates and turn it into a list of dates
   GetDateList = List.Dates(StartDate, GetDateCount,
   #duration(1,0,0,0)),
//Convert the list into a table
   DateListToTable = Table.FromList(GetDateList,
   Splitter.SplitByNothing(), {"Fecha"}, null, ExtraValues.Error),
// Convert to Date
   ConvertToDate = Table.TransformColumns(DateListToTable,{{"Fecha", Date.From, type date}}),
// Date Key
   DateKey = Table.AddColumn(ConvertToDate, "IdFecha", each Number.FromText(Text.From(Date.Year([Fecha])) & Date.ToText([Fecha],"MM") & Date.ToText([Fecha],"dd") ) , Int32.Type ),
//Add Year Column
   YearNumber = Table.AddColumn(DateKey, "Año",
   each Date.Year([Fecha]), Int32.Type),
//Add Quarter format QX
   Quarter = Table.AddColumn(YearNumber, "Trimestre",
   each Text.Combine({"Q", Text.From(Date.QuarterOfYear([Fecha]))}), type text),
//Add Month Number Column
   MonthNumber = Table.AddColumn(Quarter , "IdMes",
   each Date.Month([Fecha]), Int32.Type),
//Add Month Name Column
   MonthName = Table.AddColumn(MonthNumber , "Mes",
   each Date.ToText([Fecha],"MMMM", "es-es"), type text),
//Add Period
   Periodo = Table.AddColumn(MonthName , "Periodo",
   each Text.From([Año]) & Text.PadStart(Text.From([IdMes]),2,"0"), type text),
//Add YearQ
   TrimestreAño = Table.AddColumn(Periodo, "TrimestreAño",
   each Text.Combine({Text.From([Año]), [Trimestre]}), type text ),
//Add Day Number Column
   DayNumber  = Table.AddColumn(TrimestreAño , "Dia",
   each Date.Day([Fecha]), Int32.Type),
//Add Day Name Column
   DayName  = Table.AddColumn(DayNumber , "Nombre Dia",
   each Date.ToText([Fecha], "dddd"), type text)
in
   DayName

DAX
Al igual que el paso anterior las opciones de modelado puede acotarse más según el desarrollo y los permisos que nos estén concediendo. Entonces no debemos dejar de lado la posibilidad de construir una tabla fecha una vez ya existente el modelo tabular. La principal ventaja de éste método es construir la tabla fecha a partir de fechas del mismo modelo creado y no necesariamente predefinidas de la forma (hoy y últimos N días/meses/años). De esta forma puedo crearla a partir de la mínima y máxima fecha de mi tabla de hecho. 

En caso de dax podemos nutrir la fecha a partir de nuestra tabla de hecho o seteada a mano con la función DATE() y actual con NOW()

Date =
VAR MinYear = YEAR ( MIN ( TablaHecho[Fecha] ) )
VAR MaxYear = YEAR ( MAX ( TablaHecho[Fecha] ) )
RETURN
ADDCOLUMNS (
   FILTER (
       CALENDARAUTO( );
       AND ( YEAR ( [Date] ) >= MinYear; YEAR ( [Date] ) <= MaxYear )
   );
   "Year Number"; YEAR ( [Date] );
   "Month Name"; FORMAT ( [Date]; "mmmm" );
   "Month Number"; MONTH ( [Date] );
   "Day"; Day ( [Date] )
)

Para este tipo de casos yo soy de la frase "Mientras más atrás se resuelva, mejor". Si tenemos la posibilidad de construirlo en el origen de datos porque existe un data warehouse o tiene la posibilidad mejor. Sino intentaría siempre llevarlo por Power Query y de última instancia en DAX. No deberíamos construir modelos, ni aunque sean pequeños Power Bi de pequeñas necesidades, sin la tabla fecha. Ustedes, ¿usan tabla fecha?

Leer artículo
power bi dax power query

[DAX] Consultar detalles de un modelo tabular

¿Como puedo conocer los detalles de mi modelo de Power Bi? ¿Cuantas métricas tiene? ¿Cuales son las formulas? ¿Que tan performante son mis consultas DAX? ¿Funcionan mis agregaciones?

Todas estas y más preguntas pueden ser respondidas gracias a la herramienta DAX Studio creada por desarrolladores de SQLBI. Esta maravilla, que por cierto es muy parecida a SQL Management Studio, nos permite muchas y más detalles sobre el modelo de datos.
Tras la conexión a un modelo tabular en analysis services o un power bi desktop abierto en el escritorio, podemos acceder a consultar el modelo mediante DAX.

image

¿De que sirve? Para permitirnos correr consultas contra el modelo como si fuera una base de datos, ya sea para conocer que todo esté en su lugar, responder una duda puntual de un cliente o jefe como así tambien para controlar o debuguear que nuestras medidas/columnas/tablas que vamos a construir estén devolviendo la información correcta. El poder de la herramienta llega hasta medición de performance de cada query particular al modelo e inclusive detección de agregaciones en Power Bi (Preview feature).
Para analizar el modelo, cuando se conecten, por ejemplo, a un pbix podrán apreciar un apartado (DMV) de tablas con información del modelo que se encuentra abajo a la izquierda. 

image

Dos de las más comunes que utilizo para documentar son para conocer código dax:
select * from $SYSTEM.TMSCHEMA_MEASURES
select * from $SYSTEM.TMSCHEMA_COLUMNS where [Type]  = 2

Los animo a probar esta maravilla de herramienta para las preguntas que propuse como también para muchas mas que pueden encontrarse ustedes. Éstas son nada más y menos que algunas que me ayudaron a resolver a mi.

¿Cuales les ayudaran a resolver a ustedes?

P/D Recientemente Chris Webb encontró la forma de traer los pasos realizados en el editor de consulta de un informe en Power Bi Service. Muy útil para ayudarnos a documentar. 

Leer artículo
dax power bi desktop power bi

[PowerBiGateway] Personal vs OnPremise Data Gateway

Cada vez que que alguien quiere implementar Power Bi con fuentes on premise me consulta: "¿Que es eso del gateway personal y otro?"

Ciertamente me encontré con que la documentación de Microsoft no tiene una tablita comparadora y eso puede ocasionar dudas.

Por esta razón les dejo esta imagen que encontré que da un buen inicio de las diferencias que traen las puertas de enlace de Power Bi.

image

Es importante destacar que Personal Mode tiene la ventaja de poder configurar para actualizar a cualquier conjunto de datos de los que tiene Power Bi Desktop incluyendo código Python y R. A diferencia de On-Premises Mode que está limitado a las siguientes https://docs.microsoft.com/es-es/power-bi/service-gateway-onprem

Del lado de On-Premises Mode tenemos una posibilidad adicional en los servicios soportados que es la conexión contra un Azure Analysis Services.

Próximamente podremos hablar de puertos. Espero que les sea útil para limpiar dudas.

Leer artículo
power bi power bi service on-premise data gateway

Power Bi Service vs Report Server

Muchas veces nos encontramos con la duda de ¿Cómo implementar Power Bi?. Nos ponemos a pensar si por ir a nube o quedarnos on premise nos estaríamos perdiendo de algo, si en ambos es posible hacer todo lo deseado, si mi necesidad puntual se puede resolver. Bueno en dichos casos traigo la comparativa ofical al día de la fecha para que puedan sacar sus conclusiones respecto a este tema.

Features Power BI Report Server Power BI Service Notes
Deployment On-premises or hosted cloud Cloud Power BI Report Server can be deployed in Azure VMs (hosted cloud) if licensed through Power BI Premium
Source data Cloud and/or on-premises Cloud and/or on-premises
License Power BI Premium or SQL Server EE with SA Power BI Pro and/or Power BI Premium
Lifecycle Modern lifecycle policy Fully managed service
Release cycle Once every 4 months Once a month Latest features and fixes come to Power BI Service first. Most core functionality comes to Power BI Report Server in the next few releases; some features only meant for the Power BI service.
Create Power BI reports in Power BI Desktop Yes Yes
Create Power BI reports in the browser No Yes
Gateway required No Yes for on-premises data sources
Real-time streaming No Yes Real-time streaming in Power BI
Dashboards No Yes Dashboards in the Power BI service
Distribute group of reports using apps No Yes Create and publish apps with dashboards and reports
Content packs No Yes Organizational content packs: Introduction
Connect to services like Salesforce Yes Yes Connect to the services you use with content packs in the Power BI service. In Power BI Report Server, use certified connectors to connect to services. See Power BI report data sources in Power BI Report Server for details.
Q&A No Yes Q&A in the Power BI service and Power BI Desktop
Quick insights No Yes Automatically generate data insights with Power BI
Analyze in Excel No Yes Analyze in Excel
Paginated reports Yes Yes Paginated reports are available in the Power BI service in preview in a Premium capacity
Power BI mobile apps Yes Yes Power BI mobile apps overview
ARC GIS maps No Yes ArcGIS maps in Power BI service and Power BI Desktop by Esri
Email subscriptions for Power BI reports No Yes Subscribe yourself or others to a report or dashboard in the Power BI service
Email subscriptions for paginated reports Yes No E-Mail delivery in Reporting Services
Data alerts No Yes Data alerts in the Power BI service
Row-level security (RLS) Yes Yes Available in both DirectQuery (data source) & Import mode
Row-level security in the Power BI service
Row-level security in Power BI Report Server
Full-screen mode No Yes Full-screen mode in the Power BI service
Advanced Office 365 collaboration No Yes Collaborate in an app workspace with Office 365
R visuals No Yes Create R visuals in Power BI Desktop and publish them to the Power BI service. You can't save Power BI reports with R visuals to Power BI Report Server.
Preview features No Yes Opt in for Power BI service preview features
Custom visuals Yes Yes Custom visuals in Power BI
Power BI Desktop Version optimized for Report Server, available for download with Report Server Version optimized for Power BI Service, available from the Windows Store Power BI Desktop for the report server

Power BI Desktop for the Power BI service

Tras analizar las comparativas hay que admitir que cada uno tiene su fortaleza. Depende mucho el caso de cada uno para saber si será posible aplicar uno u otro. Yo recomiendo la mayoría de las veces Power Bi Service con licencias Pro. Solo aquellos casos que la cantidad de usuarios que ingresarán es muy elevada o cuando la institución ya tiene contratos con Microsoft para acceder a un SQL Server Enterprise sin costo adicional son los que recomendaría Power Bi Report Server.

Leer artículo
power bi power bi service power bi report server

¿En que región esta mi Power Bi?

Cuando nuestro Bi comienza a crecer y comenzamos a encontrarnos con soluciones nube de Azure data plaform es importante conocer la región donde nuestro Power Bi Service, del Tenant que usamos, esta alojado. Sea porque vamos a realizar algún desarrollo o relacionarlo con un almacenamiento de Data Lake Gen2 para DataFlows.

Para ellos nos dirigimos al menú superior derecho donde se encuentra el signo de pregunta "?" y seleccionamos "Acerca de Power Bi".


En dicha ventana encontraremos donde se encuentra ubicado nuestro tenant dentro del servicio de Power Bi.

Leer artículo
power bi power bi service power bi argentina