Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
5 years ago
Solved

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_idtransaction_idEstadoFechalatest_welcome_transaction_flag
1100Bienvenido1-Enero-21
1101En proceso3-Enero-21
1102Cancelado4-Enero-21
1103Bienvenido10-Enero-211
2104Bienvenido2-Enero-211
3105Bienvenido7-Enero-21
3106En proceso11-Enero-21
3107Entrega12-Enero-21
3108Volvió13-Enero-21
3109Bienvenido14-Enero-211
4110Bienvenido1-Feb-21
4111Bienvenido5-Feb-21
4112Bienvenido25-Febrero-211

4.) Datos de muestra con salida esperada

store_idtransaction_idFechalatest_welcome_transaction_flag#_days_since_last_transaction
110310-Enero-21161
21042-Enero-21169
310914-Enero-21157
411225-Febrero-21115
  • 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

  • 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