Replicar la lógica de la función LAG T-SQL

Un usuario Pregunto ✅

NatashaSchuster

Hola,

Esperaba obtener una respuesta a este problema tanto en DAX como en M.

Estoy tratando de replicar la función LAG T-SQL a continuación y regresar número de días desde el último pedido

SELECT
  CustomerID
, SalesOrderID
, CAST(OrderDate as DATE) AS OrderDate
, DATEDIFF(d,LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY SalesOrderID), OrderDate) as DaysSinceLastOrder
FROM Sales.SalesOrderHeader;

Estamos tratando de llegar aquí es el número de días desde el último pedido.

por ejemplo, del 22/7/2005 al 22/7/2007 es de 730 días y

22/7/2007 al 4/11/2007 son 105 días

Identificación del cliente SalesOrderID Fecha de orden DaysSinceLastOrder
11000 43793 22/7/2005 NULO
11000 51522 22/7/2007 730
11000 57418 4/11/2007 105
11001 43767 18/7/2005 NULO
11001 51493 20/7/2007 732
11001 72773 12/06/2008 328
11002 43736 10/7/2005 NULO
11002 51238 4/7/2007 724
11002 53237 27/8/2007 54
11003 43701 1/7/2005 NULO
11003 51315 9/7/2007 738
11003 57783 11/11/2007 125
11004 43810 26/7/2005 NULO
11004 51595 26/7/2007 730
11004 57293 2/11/2007 99

Comencé a armar un código DAX pero devuelve el número total de días que, por ejemplo, para la fila 3 en lugar de 105, devuelve 835 (730 + 105).

Revelación

  = DATEDIFF(
        CALCULATE(MIN(LAGfunction[OrderDate]), ALLEXCEPT(LAGfunction, LAGfunction[CustomerID]) ),
        CALCULATE(MAX(LAGfunction[OrderDate]), ALLEXCEPT(LAGfunction,  LAGfunction[CustomerID], LAGfunction[SalesOrderID]) ),
        DAY 
    )

= DATEDIFF (CALCULATE (MIN (LAGfunction[OrderDate]), ALLEXCEPT (función LAG, función LAG[CustomerID])), CALCULAR (MAX (función LAG[OrderDate]), ALLEXCEPT (función LAG, función LAG[CustomerID], Función LAG[SalesOrderID]) ), DÍA )

image.png

Gracias

hola @NatashaSchuster

Después de mi investigación, puede hacer esto, siga mis pasos de la siguiente manera:

Paso 1:

use la función rankx para agregar una columna de rango de grupo

group rank = RANKX(FILTER(LAGfunction,LAGfunction[CustomerID]=EARLIER(LAGfunction[CustomerID])),LAGfunction[SalesOrderID],,ASC)

Paso 2:

use la función eralier para agregar la columna de resultados

Column = DATEDIFF(CALCULATE(MAX(LAGfunction[OrderDate]),FILTER(LAGfunction,LAGfunction[CustomerID]=EARLIER(LAGfunction[CustomerID])&&LAGfunction[group rank]=EARLIER(LAGfunction[group rank])-1)),LAGfunction[OrderDate],DAY)

Resultado:

1.PNG

aquí está pbix, inténtelo.

https://www.dropbox.com/s/8ivwqgzxqmk7byg/Replicate%20LAG%20T-SQL%20function%20logic.pbix?dl=0

Atentamente,

Lin

Ashish_Mathur

Hola,

Prueba esta fórmula de columna calculada

= si (ISBLANK (CALCULATE (MAX (Data[OrderDate]), FILTRO (Datos, Datos[CustomerID]= ANTES (Datos[CustomerID])&&Datos[OrderDate]

Espero que esto ayude.

Untitled.png

Ashish_Mathur

Hola,

Prueba esta fórmula de columna calculada

= si (ISBLANK (CALCULATE (MAX (Data[OrderDate]), FILTRO (Datos, Datos[CustomerID]= ANTES (Datos[CustomerID])&&Datos[OrderDate]

Espero que esto ayude.

Untitled.png

hola @NatashaSchuster

Después de mi investigación, puede hacer esto, siga mis pasos de la siguiente manera:

Paso 1:

use la función rankx para agregar una columna de rango de grupo

group rank = RANKX(FILTER(LAGfunction,LAGfunction[CustomerID]=EARLIER(LAGfunction[CustomerID])),LAGfunction[SalesOrderID],,ASC)

Paso 2:

use la función eralier para agregar la columna de resultados

Column = DATEDIFF(CALCULATE(MAX(LAGfunction[OrderDate]),FILTER(LAGfunction,LAGfunction[CustomerID]=EARLIER(LAGfunction[CustomerID])&&LAGfunction[group rank]=EARLIER(LAGfunction[group rank])-1)),LAGfunction[OrderDate],DAY)

Resultado:

1.PNG

aquí está pbix, inténtelo.

https://www.dropbox.com/s/8ivwqgzxqmk7byg/Replicate%20LAG%20T-SQL%20function%20logic.pbix?dl=0

Atentamente,

Lin

Deja un comentario

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