Recientemente eh notado un incremento de consultas sobre comparaciones de fecha contra un periodo anterior. Si bien tenía pendiente realizar un post de esto, se me había pasado y ahora reflotó.
Comparar contra un periodo anterior en un contexto actual puede ser engañoso. La mayoría puede pensar que SAMEPERIODLASTYEAR lo resuelve todo y no tenemos que pensar más nada, pero lo cierto es que la correcta aplicación depende mucho del requerimiento, visualización y contexto.
Este pequeño artículo definirá el funcionamiento de las funciones más comunes para este escenario para entender cuando usar una u otra.
Normalmente puede que no veamos diferencia que nos represente un inconveniente cuando analizamos un gran histórico, puesto que la principal ocurrencia que podría corromper nuestros datos pasa por el contexto de filtros o un periodo "actual". Veamos un poco de cada función para entender su diferencia.
NOTA: Recordemos que para utilizar las funciones de inteligencia de tiempo necesitamos una tabla calendario o tabla fecha. Si no sabes como crear una puedes revisar este post.
DATEADD
Definición de Microsoft: Devuelve una tabla que contiene una columna de fechas que se han desplazado hacia delante o hacia atrás en el tiempo según el número especificado de intervalos desde las fechas del contexto actual.
DATEADD(<dates>,<number_of_intervals>,<interval>)
La clave en esto es la especificación que los intervalos bajo los cuales se moverá nuestra función está encasillado en el "contexto actual" de fechas. Esto significa que buscará para atras según nuestro periodo.
Para entender mejor nos vamos a basar en un clásico ejemplo de "mismo mes año anterior". Generando un contexto de la siguiente forma:
DATEADD( TablaCalendario[Fecha], -1, YEAR )
¿Cómo funciona este contexto? Si tenemos seleccionado el año actual y mes de enero, nuestra medida con ese código representará el año anterior de enero. En este caso nuestor contexto es "enero". Siempre representaría años de enero.

Esto suena totalmente normal en un mes pasado, pero no sería el caso de un contexto actual a nivel de año. Lo que establecemos al escribir YEAR en nuestra función es aclarar que el contexto de meses y dias está atado hasta la fecha actual que tenga datos el contexto.
Por ejemplo hoy es 10 de noviembre del 2022. Eso significa que mi mes de noviembre 2022 solo tiene 10 días de datos y faltan 20. Al comparar contra un año debo tener presente eso, porque la función DATEADD comparará todo el año hasta el 10 de noviembre del 2021. Veamos una foto:

La tabla de la izquierda mes a mes nos provoca la sensación que todo lo que necesitamos es correcto y no tendríamos problemas. Sin embargo, la tabla de agrupación anual nos demuestra que el valor que reconoce la Medida LastYear para es incorrecta, dado que muestra 13418 en lugar de 14099. Esto ocurre porque el análisis 2021 frena su historia en la última fecha del 2022.
Esto no quiere decir que no sirva nuestra función, sino más bien que el tercer parémetro de la función controla que el contexto del periodo a analizar tiene como límite el hasta de nuestra fecha. Lo mismo ocurriría si comparamos noviembre usando en nuestro DATEADD el parámetro MONTH dado que compararía Octubre hasta el día 10.
Esto no es malo puesto que nos da una comparativa exacta de evolución entre años, pero hay que conocer la función que aplicamos.
PARALLELPERIOD
Definición de Microsoft: Devuelve una tabla que contiene una columna de fechas que representa un período paralelo a las fechas de la columna dates especificada, en el contexto actual, con las fechas desplazadas un número de intervalos hacia delante o hacia atrás en el tiempo.
PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)
Nuestra palabra clave aqui es período paralelo. Hace referencia a que se centrará en completar el contexto que definamos en la función independientemente de que tengamos datos hasta cierta fecha. Trabajaría hasta la granularidad definida en el tercer parámetro.
Entonces si usamos el mismo ejemplo de antes y completamos el contexto de esta forma:
PARALLELPERIOD( TablaCalendario[Fecha], -1, YEAR )
Lo que especificamos en la función establece que desea traer del pasado años completos independientemente que el analizado en el momento (como el actual) esté completo. Veamos un ejemplo con las tablas recientes:

Podemos apreciar en la tabla pequeña que dicha función sería capas de establecer una consulta al periodo completo anterior independiente del contexto trabajado. Por ello llegamos al resultado esperado 14099.
Advertencia: veamos también que la tabla grande tiene una particularidad. Al pedir el periodo año completo, estamos forzando un contexto de filtros de la mano de calculate. Lo que significa que generaría el año anterior completo independiente del mes en el que estemos posicionados.
Y…. ¿SAMEPERIODLASTYEAR ?
Definición de Microsoft: Devuelve una tabla que contiene una columna de fechas desplazadas un año atrás en el tiempo desde las fechas de la columna dates especificada, en el contexto actual.
En este caso de la famosa función muy usada, es una a partir de otra existente. Esto significa que por detrás funciona igual que otra función. En este caso al estar acotada a un año especifico las siguientes lineas generarían el mismo contexto:
SAMEPERIODLASTYEAR ( TablaCalendario[Fecha] )
DATEADD( TablaCalendario[Fecha], -1, YEAR )
Pueden ver el funcionamiento de las imagenes y funciones en el ejemplo de Power Bi Desktop en mi Github.
¡Eso es todo amigos! Como pueden ver es de suma importancia conocer estas diferencias entre funciones para responder adecuadamente según el contexto o la visualización en la que lo usemos. Espero que esto los ayude a devolverl los números correctos en sus informes.