Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

[DAX] Contar duplicados dentro de un período de tiempo

Hola a todos;

Me preguntaba si había una manera de contar duplicados, pero solo dentro de un período de tiempo (2 días).

Tengo un conjunto de datos que se parece a este:

IDENTIFICACIÓN Fecha
130-05-2022
128-05-2022
230-05-2022
330-05-2022
430-05-2022
201-05-2022

Si un ID se repite dos veces (o más) dentro de las 48 horas, entonces quiero que se etiquete como un duplicado, en la tabla anterior, por ejemplo, el ID 1 es un duplicado, el ID 2 no lo es.

esta columna calculada me permite contar el número de duplicados:

CALCULAR ( COUNT ( 'Table'[ID] ), ALLEXCEPT ( 'Table', 'Table'[ID]) )

¿Cómo puedo mejorarlo de una manera que cuente solo los duplicados que ocurren dentro de un período de 48 horas?

¡Gracias por su ayuda!

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

@KanisleS,

Pruebe esta columna calculada:

Duplicate = 
VAR vDate = 'Table'[Date]
VAR vDate2 =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        ALLEXCEPT ( 'Table', 'Table'[ID] ),
        'Table'[Date] <> vDate
    )
VAR vResult =
    SWITCH (
        TRUE,
        // one row exists for an ID
        ISBLANK ( vDate2 ), "N",
        // get number of days between dates for an ID
        IF ( ABS ( DATEDIFF ( vDate, vDate2, DAY ) ) <= 2, "Y", "N" )
    )
RETURN
    vResult

DataInsights_0-1654004191541.png

View solution in original post

20 REPLIES 20
Syndicate_Admin
Administrator
Administrator

@DataInsights

¡Gracias por tu ayuda hasta ahora!

Recibo este error:

Las operaciones de comparación de DAX no admiten la comparación de valores de tipo Text con valores de tipo Integer. Considere la posibilidad de utilizar la función VALUE o FORMAT para convertir uno de los valores.

He eliminado el

 // exclude a particular call
        'Ad Spend - Sponsored'[Call_CLI] = 448716630, "N/A",

parte y funciona, por lo que debe ser porque la CLI está configurada como texto?

No estoy seguro de en qué más puedo establecer el tipo de datos.

@JH25,

Si Call_CLI es un tipo de datos de texto, incruste el valor entre comillas dobles:

'Ad Spend - Sponsored'[Call_CLI] = "448716630", "N/A",
Syndicate_Admin
Administrator
Administrator

Hola, quiero hacer lo mismo pero solo quiero que etiquete la segunda entrada como un duplicado, ¿es esto posible?

@JH25,

¿Cómo se define "segunda entrada"? ¿Se basa en el orden de clasificación de la tabla o tiene una fecha posterior a la primera entrada? Sírvase proporcionar datos de muestra y el resultado esperado.

Hola, serían las entradas posteriores las que serían duplicadas en función del tiempo y no del orden de clasificación.

He cambiado su código a lo siguiente, lo que hace que lo haga en función de los últimos 30 días en minutos.

Duplicate = 
VAR vDate = 'Ad Spend - Sponsored'[Header_Created]
VAR vDate2 =
    CALCULATE (
        MAX ( 'Ad Spend - Sponsored'[Header_Created] ),
        ALLEXCEPT ( 'Ad Spend - Sponsored','Ad Spend - Sponsored'[Call_CLI]),
        'Ad Spend - Sponsored'[Header_Created] <> vDate
    )
VAR vResult =
    SWITCH (
        TRUE,
        // one row exists for an ID
        ISBLANK ( vDate2 ), "N",
        // get number of days between dates for an ID
        IF ( ABS ( DATEDIFF ( vDate, vDate2, MINUTE ) ) <= 43200, "Y", "N" )
    )
RETURN
    vResult

Eso está funcionando, pero muestra que sí para todas las entradas en lugar de solo el 2º 3º, etc.

Aquí hay un ejemplo.

JH25_1-1671108153665.png

También quiero excluir un Call_CLI en particular de la calcualción, ¿es eso posible?

Espero que todo tenga sentido.

@JH25,

Prueba esta columna calculada:

Duplicate = 
VAR vDate =
    'Ad Spend - Sponsored'[Header_Created]
VAR vDate2 =
    CALCULATE (
        MAX ( 'Ad Spend - Sponsored'[Header_Created] ),
        ALLEXCEPT ( 'Ad Spend - Sponsored','Ad Spend - Sponsored'[Call_CLI]),
        'Ad Spend - Sponsored'[Header_Created] <> vDate
    )
VAR vMinDate =
    CALCULATE (
        MIN ( 'Ad Spend - Sponsored'[Header_Created] ),
        ALLEXCEPT ( 'Ad Spend - Sponsored','Ad Spend - Sponsored'[Call_CLI])
    )
VAR vResult =
    SWITCH (
        TRUE,
        // exclude a particular call
        'Ad Spend - Sponsored'[Call_CLI] = 448716630, "N/A",
        // one row exists for an ID
        ISBLANK ( vDate2 ), "N",
        // current row is earliest date for the Call_CLI
        vDate = vMinDate, "N",
        // number of minutes is within threshold
        ABS ( DATEDIFF ( vDate, vDate2, MINUTE ) ) <= 43200, "Y"
    )
RETURN
    vResult

DataInsights_0-1671407556714.png

@DataInsights

Entonces, al verificar los datos, el 95% + se ve bien, pero en alguna ocasión esto sucede:

JH25_0-1671453873184.png

No puedo entender por qué, ¿no puedo ver una correlación?

@JH25,

Para solucionar esto, comenzaría forzando cada expresión de resultado en la función SWITCH para devolver un valor único. Actualmente, la segunda y tercera expresiones de resultado devuelven "N". Una vez que sepa qué expresión se está evaluando para una fila, puede analizar más a fondo qué podría estar causándola. En lugar de devolver vResult, devuelva una expresión como la siguiente. Esto le permite ver las variables subyacentes.

vDate & " | " & vDate2 & " | " & vMinDate

@DataInsights Gracias, eso tiene sentido, así que he hecho lo siguiente:

VAR vResult =
    SWITCH (
        TRUE,
       'Ad Spend - Sponsored'[Call_CLI] = "+266696687", "withheld",
        // one row exists for an ID
        ISBLANK ( vDate2 ), "one row",
        // current row is earliest date for the Call_CLI
        vDate = vMinDate, "earliest",
        // number of minutes is within threshold
    ABS ( DATEDIFF ( vDate, vDate2, MINUTE ) ) <=43200, "Y"

Cambié su código y agregué una "N" al final de:

ABS ( DATEDIFF ( vDate, vDate2, MINUTE ) ) <=43200, "Y"
Como fue en el último, pensé que podría haber sido un descuido y parece ser esos, ya que ahora están saliendo en blanco.

JH25_1-1671464619801.png

¿Así que supongo que es necesario incluir más código?

También tiene este problema:

JH25_2-1671464796289.png

Hay 8 meses entre ellos, así que no estoy seguro de por qué serían etiquetados como 'Y'

@JH25,

Pruebe este enfoque:

Duplicate = 
VAR vDate =
    'Ad Spend - Sponsored'[Header_Created]
VAR vMinDate =
    CALCULATE (
        MIN ( 'Ad Spend - Sponsored'[Header_Created] ),
        ALLEXCEPT ( 'Ad Spend - Sponsored','Ad Spend - Sponsored'[Call_CLI])
    )
VAR vResult =
    SWITCH (
        TRUE,
       'Ad Spend - Sponsored'[Call_CLI] = "+266696687", "withheld",
        // earliest row for a Call_CLI
        vDate = vMinDate, "N",
        // subsequent row for a Call_CLI and number of minutes is within threshold
        vDate <> vMinDate && DATEDIFF ( vMinDate, vDate, MINUTE ) <= 43200, "Y",
        // subsequent row for a Call_CLI and number of minutes is not within threshold
        "N"
    )
RETURN
    vResult

DataInsights_0-1671467553026.png

@DataInsights Gracias por su ayuda, realmente lo aprecio!!

Eso parece estar funcionando.

Esto podría ser demasiado complicado, pero ¿hay alguna manera de tratar cada llamada para que tengan su propia ventana de tiempo duplicada?

En su ejemplo, idealmente, la última llamada debe ser un duplicado, ya que llegó dentro de los 30 días posteriores a la llamada anterior.

JH25_0-1671470205590.png

@JH25,

Prueba esto:

Duplicate = 
VAR vDate =
    'Ad Spend - Sponsored'[Header_Created]
VAR vLatestPreviousDate =
    CALCULATE (
        MAX ( 'Ad Spend - Sponsored'[Header_Created] ),
        ALLEXCEPT ( 'Ad Spend - Sponsored','Ad Spend - Sponsored'[Call_CLI]),
        'Ad Spend - Sponsored'[Header_Created] < vDate
    )
VAR vResult =
    SWITCH (
        TRUE,
       'Ad Spend - Sponsored'[Call_CLI] = "+266696687", "withheld",
        // earliest row for a Call_CLI
        ISBLANK ( vLatestPreviousDate ), "N",
        // subsequent row for a Call_CLI and number of minutes is within threshold
        DATEDIFF ( vLatestPreviousDate, vDate, MINUTE ) <= 43200, "Y",
        // subsequent row for a Call_CLI and number of minutes is not within threshold
        "N"
    )
RETURN
    vResult

DataInsights_0-1671484370765.png

@DataInsights Increíble, muchas gracias!!! ¡Es perfecto! !

¡¡Muchas gracias!!

Gracias por su ayuda hasta ahora @DataInsights !

Recibo el siguiente error: las operaciones de comparación de DAX no admiten la comparación de valores de tipo Text con valores de tipo Integer. Considere la posibilidad de utilizar la función VALUE o FORMAT para convertir uno de los valores.

Creo que tiene que ver con esta parte de la fórmula:

'Gasto publicitario - Patrocinado'[Call_CLI] = 448716630, "N/A",

El Call_CLI se establece como texto

Gracias por su ayuda hasta ahora @DataInsights

Obteniendo el siguiente error,

Las operaciones de comparación de DAX no admiten la comparación de valores de tipo Text con valores de tipo Integer. Considere la posibilidad de utilizar la función VALUE o FORMAT para convertir uno de los valores.

Tiene que ver con esta línea:

'Gasto publicitario - Patrocinado'[Call_CLI] = 448716630, "N/A",

¿Se debe a que el campo Call_Cli es texto?

@DataInsights

¡Gracias por tu ayuda hasta ahora!

Recibo este error:

Las operaciones de comparación de DAX no admiten la comparación de valores de tipo Text con valores de tipo Integer. Considere la posibilidad de utilizar la función VALUE o FORMAT para convertir uno de los valores.

No estoy seguro de en qué más puedo establecer el tipo de datos.

Syndicate_Admin
Administrator
Administrator

@KanisleS,

Pruebe esta columna calculada:

Duplicate = 
VAR vDate = 'Table'[Date]
VAR vDate2 =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        ALLEXCEPT ( 'Table', 'Table'[ID] ),
        'Table'[Date] <> vDate
    )
VAR vResult =
    SWITCH (
        TRUE,
        // one row exists for an ID
        ISBLANK ( vDate2 ), "N",
        // get number of days between dates for an ID
        IF ( ABS ( DATEDIFF ( vDate, vDate2, DAY ) ) <= 2, "Y", "N" )
    )
RETURN
    vResult

DataInsights_0-1654004191541.png

¡Gracias leyenda!

Helpful resources

Announcements
LearnSurvey

Fabric certifications survey

Certification feedback opportunity for the community.

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.