Forum Discussion
Falla la dependencia circular con diff de fecha
El objetivo es crear una columna calculada que contará el número de días entre la última transacción y hoy. Actualmente he calculado columna que marcará la transacción más reciente para cada tienda. A partir de esta columna calculada, traté de crear otra columna calculada que contará el número de días entre el último indicador de transacción y hoy usando DATEDIFF. Esto no funcionó porque "se detectó la dependencia circular". A continuación se presentan referencias: 1.) La bandera que me dirá la última transacción por tienda 2.) La columna calculada con errores que intenté crear 3.) Datos de muestra con salida actual 4.) Datos de muestra con salida esperada
¿Algún consejo sobre cómo puedo lograr el objetivo de crear una columna calculada que contará el número de días entre la última transacción y hoy? Su consejo es muy apreciado.
1.) La bandera que me dirá la última transacción por tienda
latest_welcome_transaction_flag =
IF(
CALCULATE(
MAX( table[date] ),
FILTER(
VALUES( table[date] ),
table[date] = CALCULATE(
MAX( table[date] ),
ALLEXCEPT( table, table[store_id] ) ,
LEFT( table[status], 7 ) = "Welcome"
)
)
) <> BLANK(),
1
)
2.) La columna calculada fallida que intenté crear dando como resultado "Se detectó dependencia circular"
# of Days Since Last Transaction.WelComeOpp =
IF( table[latest_welcome_transaction_flag] = 1,
DATEDIFF(
table[date], TODAY(), DAY
)
)
3.) Datos de muestra con salida actual
| store_id | transaction_id | Estado | Fecha | latest_welcome_transaction_flag |
| 1 | 100 | Bienvenido | 1-Enero-21 | |
| 1 | 101 | En proceso | 3-Enero-21 | |
| 1 | 102 | Cancelado | 4-Enero-21 | |
| 1 | 103 | Bienvenido | 10-Enero-21 | 1 |
| 2 | 104 | Bienvenido | 2-Enero-21 | 1 |
| 3 | 105 | Bienvenido | 7-Enero-21 | |
| 3 | 106 | En proceso | 11-Enero-21 | |
| 3 | 107 | Entrega | 12-Enero-21 | |
| 3 | 108 | Volvió | 13-Enero-21 | |
| 3 | 109 | Bienvenido | 14-Enero-21 | 1 |
| 4 | 110 | Bienvenido | 1-Feb-21 | |
| 4 | 111 | Bienvenido | 5-Feb-21 | |
| 4 | 112 | Bienvenido | 25-Febrero-21 | 1 |
4.) Datos de muestra con salida esperada
| store_id | transaction_id | Fecha | latest_welcome_transaction_flag | #_days_since_last_transaction |
| 1 | 103 | 10-Enero-21 | 1 | 61 |
| 2 | 104 | 2-Enero-21 | 1 | 69 |
| 3 | 109 | 14-Enero-21 | 1 | 57 |
| 4 | 112 | 25-Febrero-21 | 1 | 15 |
Allí @win_anthony
Intente reescribir su primera columna calculada de esta forma:
latest_welcome_transaction_flag = VAR LatestWelcomeDatePerStore = CALCULATE ( MAX ( 'table'[date] ), ALLEXCEPT ( 'table', 'table'[store_id] ), LEFT ( 'table'[status], 7 ) = "Welcome" ) RETURN IF ( 'table'[date] = LatestWelcomeDatePerStore, 1 )He simplificado un poco el código y me he asegurado de que la función CALCULATE, a la que se llama en el contexto de fila de la tabla, incluya un ALLEXCEPT que quita filtros en todas las columnas excepto store_id.
Originalmente, la llamada más externa a CALCULATE agregó filtros correspondientes a todas las columnas, incluido # de Days Since Last Transaction.WelComeOpp, que creó una referencia circular.
Cada vez que se llama a CALCULATE en una columna calculada, la "transición de contexto" hace que los valores de todas las columnas de la fila actual se conviertan en un filtro equivalente, a menos que esas columnas se excluyan del contexto de filtro resultante mediante ALLEXCEPT/REMOVEFILTERS.
Hay un buen artículo sobre este tema general aquí en SQLBI.
saludos
Owen
1 Reply
- Syndicate_Admin
Administrator
Allí @win_anthony
Intente reescribir su primera columna calculada de esta forma:
latest_welcome_transaction_flag = VAR LatestWelcomeDatePerStore = CALCULATE ( MAX ( 'table'[date] ), ALLEXCEPT ( 'table', 'table'[store_id] ), LEFT ( 'table'[status], 7 ) = "Welcome" ) RETURN IF ( 'table'[date] = LatestWelcomeDatePerStore, 1 )He simplificado un poco el código y me he asegurado de que la función CALCULATE, a la que se llama en el contexto de fila de la tabla, incluya un ALLEXCEPT que quita filtros en todas las columnas excepto store_id.
Originalmente, la llamada más externa a CALCULATE agregó filtros correspondientes a todas las columnas, incluido # de Days Since Last Transaction.WelComeOpp, que creó una referencia circular.
Cada vez que se llama a CALCULATE en una columna calculada, la "transición de contexto" hace que los valores de todas las columnas de la fila actual se conviertan en un filtro equivalente, a menos que esas columnas se excluyan del contexto de filtro resultante mediante ALLEXCEPT/REMOVEFILTERS.
Hay un buen artículo sobre este tema general aquí en SQLBI.
saludos
Owen