Equivalente de SQL Subquery en DAX para datos de series temporales

Un usuario Pregunto ✅

nt7331

Hola,

Tengo algunos problemas para descubrir cómo crear una vista personalizada de mis datos que resuma los datos de series temporales en un formato de tabla. Intenté hacer algunas columnas personalizadas y tablas calculadas, pero no encontré la manera de hacer lo que estoy tratando de hacer. En SQL, podría resolverse con bastante facilidad usando subconsultas para valores de columna, pero no estoy seguro de cómo hacerlo en DAX.

Los datos que tengo son series de tiempo con valores que se ven así:

IDENTIFICACIÓN Fecha Valor
97799 28/03/2017 5
97799 23/03/2017 10
97799 28/02/2017 7
97799 28/03/2016 8
97795 28/03/2017 2
97795 23/03/2017 4
97795 28/02/2017 1
97795 28/03/2016

2

Y la tabla de resumen que estoy tratando de crear se vería así:

IDENTIFICACIÓN último valor Valor 5D Antes Valor 1 mes antes Valor 1 año antes
97799 5 10 7 8
97795 2 4 1 2

¿Alguien puede señalarme en la dirección correcta?

Hola @nt7331,

Consulte la siguiente fórmula DAX para crear una tabla calculada:

result TB =
SUMMARIZE (
    TB2,
    TB2[ID],
    "Last value", CALCULATE (
        FIRSTNONBLANK ( TB2[Value], 1 ),
        FILTER ( TB2, TB2[Date] = MAX ( TB2[Date] ) )
    ),
    "Value 5D Before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAX ( TB2[Date] ) - 5 )
    ),
    "Value 1 month before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAXX ( TB2, DATEADD ( TB2[Date], -1, MONTH ) ) )
    ),
    "Value 1 year before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAXX ( TB2, DATEADD ( TB2[Date], -1, YEAR ) ) )
    )
)

1 PNG

Atentamente,

Yuliana Gu

Hola @nt7331,

Consulte la siguiente fórmula DAX para crear una tabla calculada:

result TB =
SUMMARIZE (
    TB2,
    TB2[ID],
    "Last value", CALCULATE (
        FIRSTNONBLANK ( TB2[Value], 1 ),
        FILTER ( TB2, TB2[Date] = MAX ( TB2[Date] ) )
    ),
    "Value 5D Before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAX ( TB2[Date] ) - 5 )
    ),
    "Value 1 month before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAXX ( TB2, DATEADD ( TB2[Date], -1, MONTH ) ) )
    ),
    "Value 1 year before", CALCULATE (
        SUM ( TB2[Value] ),
        FILTER ( TB2, TB2[Date] = MAXX ( TB2, DATEADD ( TB2[Date], -1, YEAR ) ) )
    )
)

1 PNG

Atentamente,

Yuliana Gu

Stachu

prueba estas medidas:

Value year before = 
VAR TempDate = LASTDATE(DATEADD('Table'[Date],-1,YEAR))
RETURN
CALCULATE(SUM('Table'[Value]),'Table'[Date]=TempDate)

Value Month before = 
VAR TempDate = LASTDATE(DATEADD('Table'[Date],-1,MONTH))
RETURN
CALCULATE(SUM('Table'[Value]),'Table'[Date]=TempDate)

Value 5D = 
VAR TempDate = MAX('Table'[Date])-5
RETURN
CALCULATE(SUM('Table'[Value]),'Table'[Date]=TempDate)

Last value = 
VAR TempDate = MAX('Table'[Date])
RETURN
CALCULATE(SUM('Table'[Value]),'Table'[Date]=TempDate)

nt7331

En respuesta a Stachu

¡Gracias por la respuesta! Ya llegué tan lejos, pero esas medidas solo obtendrían los valores de la identificación con la fecha más reciente, ¿verdad? Necesito calcular esos valores para cada ID único en la tabla, que es donde tengo problemas para descubrir cómo lograrlo. El equivalente de SQL a lo que me gustaría hacer sería algo como:

select ID,
	"Last Value" = (Select Top(1) [Value] FROM Table1 WHERE ID = MII.ID and ReferenceDate = LastMIIDate.LastReferenceDate),
	"5D Value" = (Select Top(1) [Value] FROM Table1 WHERE ID = MII.ID and ReferenceDate <= DATEADD(day, -5, LastReferenceDate) ORDER BY ReferenceDate DESC)
FROM Table1 MII
	LEFT OUTER JOIN (Select ID, max(RefDate) as LastReferenceDate from Table1 group by ID) as LastMIIDate on LastMIIDate.ID = MII.ID
GROUP BY MII.ID, LastReferenceDate

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *