DAX / Query para deduplicar datos de Append Only BigQuery Warehouse

Un usuario Pregunto ✅

lemarcfj

Hola,

Necesito desesperadamente una fórmula DAX o una consulta que deduzca de manera efectiva los datos de Facebook Ads provenientes de mi almacén de BigQuery. Utilizo una herramienta ETL para replicar automáticamente los datos de FB Ads al almacén. Dado que tenemos un almacén de solo anexos, las filas repetidas de la ventana de atribución de 28 días de Facebook se agregan y dan como resultado valores duplicados para diferentes dimensiones (campañas). La herramienta ETL (llamada Stitch) que se proporciona aquí proporciona esta consulta de muestra:

SELECCIONAR DISTINTO o. *
DESDE [stitch-analytics-bigquery-123:ecommerce.orders] o
UNIR INTERNAMENTE (
SELECCIONAR ID,
MAX (_sdc_sequence) AS seq,
MAX (_sdc_batched_at) COMO lote
DESDE [stitch-analytics-bigquery-123:ecommerce.orders]
GRUPO POR id) oo
ON o.id = oo.id
Y o._sdc_sequence = oo.seq
Y o._sdc_batched_at = oo.batch

Este enfoque utiliza una subconsulta para obtener una lista única de la clave principal de cada fila, el número de secuencia máximo (_sdc_sequence) y la marca de tiempo máxima por lotes en (_sdc_batched_at). Dado que es posible tener registros duplicados en su almacén, la consulta también selecciona solo registros distintos de la última versión de la fila. Luego une la tabla original a la Clave principal, la secuencia máxima y el máximo de lotes, lo que hace que todos los demás valores de columna estén disponibles para consultas.

¿Alguien puede ayudarme con una fórmula / consulta DAX que se adapte a lo que necesito? Adjunto un archivo de Excel con datos de muestra y columnas _sdc del ejemplo anterior. También tiene el aspecto que tendría una tabla deducida ideal. ¡Gracias por adelantado!

yan

En respuesta a v-yuezhe-msft

@lemarcfj estás en el camino equivocado. Evite la deduplicación en el lado del cliente, ya que necesitaría importar todo antes de hacerlo, a menos que PowerQuery sea lo suficientemente inteligente como para desplegarse correctamente (es decir, traducir a SQL nativo).

Es mejor deducir el lado de BQ e importar el conjunto de datos filtrado en su lugar.

1. No utilice una vista de BigQuery para deduplicar sobre la marcha, ya que es probable que esto sea lento.

2. Instale una tabla separada que contenga los registros únicos de ‘campaña’; puede programar dicha consulta en BQ para que se ejecute diariamente, por ejemplo

3. Una vez que se crea / actualiza la tabla, consulte esa en PowerBI. Evitaría el controlador ODBC y puede usar el conector de BigQuery integrado tal cual (y aprovechar DirectQuery).

Sin embargo, su lógica de depup no está clara y necesita una revisión; por ejemplo, pensé que estaría interesado en sumar el gasto en lugar del último. Aun así, probablemente terminará usando una función de ventana como ROW_NUM () para ordenar por lo que sea y mantener el primer registro de cada ventana (por ejemplo, campaña).

Puede buscar en Stackoverflow, ya que muchos ya han preguntado cómo deduplicar, o puede hacer una nueva pregunta si es lo suficientemente específico.

@lemarcfj,

Crea la siguiente columna en tu tabla.

RANK = RANKX(FILTER('Raw','Raw'[Facebook Campaign]=EARLIER('Raw'[Facebook Campaign])&&'Raw'[_sdc_sequence]=EARLIER('Raw'[_sdc_sequence])),'Raw'[_sdc_batched_at],,DESC)

1.PNG

Crea las siguientes medidas en tu tabla.

MAXSDC_SEQUENCE = CALCULATE(MAX('Raw'[_sdc_sequence]),ALLEXCEPT('Raw','Raw'[Facebook Campaign]))
chkmeasure = IF(MAX('Raw'[_sdc_sequence])=[MAXSDC_SEQUENCE]&&MAX('Raw'[RANK])=1,1,0)

2.PNG

Cree una tabla visual como se muestra en la siguiente captura de pantalla, arrastre chkmeasure al filtro de nivel visual y establezca su valor en 1.
3.PNG

Saludos,
Lydia

lemarcfj

En respuesta a v-yuezhe-msft

Creo que necesito que se complete toda esta consulta al ingresar al modelo de datos para que los datos que estoy presentando en los paneles ya se extraigan de la tabla más «reciente». No tengo los recursos internos para escribir la consulta directamente en BigQuery. ¿Cómo se puede hacer esto para que los datos extraídos en el modelo utilicen esta consulta?

Otro ejemplo de dónde esto es un problema es si un Campaign_Name no tiene un 1 = verdadero, obtendrá valores en blanco, lo que sería el caso siempre que no incluya la fecha de lote más reciente incluida en el filtro. ¿Tiene sentido?

lemarcfj

En respuesta a v-yuezhe-msft

Disculpas, puedes ignorar el último mensaje. Le faltaba un símbolo al DAX. Su solución parece estar funcionando parcialmente, ya que de hecho extrajo un número más cercano a un valor deducido, pero faltan algunos de los campain_name. La lógica que identifica los nombres de campaña con un 1 o 0 no considera TODAS las variantes de nombre de campaña.

En respuesta a lemarcfj

@lemarcfj,

¿Podría publicar todos los datos en su tabla y publicar el resultado esperado basado en los datos de muestra?

Además, cuando se usa el conector de Google BigQuery en Power BI Desktop, no es posible escribir una declaración SQL. Un método es crear una fuente de datos ODBC para bigQuery y luego conectarse a la fuente de datos ODBC junto con la declaración SQL.

Saludos,
Lydia

yan

En respuesta a v-yuezhe-msft

@lemarcfj estás en el camino equivocado. Evite la deduplicación en el lado del cliente, ya que necesitaría importar todo antes de hacerlo, a menos que PowerQuery sea lo suficientemente inteligente como para desplegarse correctamente (es decir, traducir a SQL nativo).

Es mejor deducir el lado de BQ e importar el conjunto de datos filtrado en su lugar.

1. No utilice una vista de BigQuery para deduplicar sobre la marcha, ya que es probable que esto sea lento.

2. Instale una tabla separada que contenga los registros únicos de ‘campaña’; puede programar dicha consulta en BQ para que se ejecute diariamente, por ejemplo

3. Una vez que se crea / actualiza la tabla, consulte esa en PowerBI. Evitaría el controlador ODBC y puede usar el conector de BigQuery integrado tal cual (y aprovechar DirectQuery).

Sin embargo, su lógica de depup no está clara y necesita una revisión; por ejemplo, pensé que estaría interesado en sumar el gasto en lugar del último. Aun así, probablemente terminará usando una función de ventana como ROW_NUM () para ordenar por lo que sea y mantener el primer registro de cada ventana (por ejemplo, campaña).

Puede buscar en Stackoverflow, ya que muchos ya han preguntado cómo deduplicar, o puede hacer una nueva pregunta si es lo suficientemente específico.

lemarcfj

En respuesta a yan

Gracias por su respuesta. Sospeché que tendría más sentido deducir del lado BQ y lo acabas de confirmar. Pude obtener la consulta que necesito para que esto suceda, pero desafortunadamente soy más una estrategia híbrida / analista técnico y no sabría qué hacer con la consulta dentro de la interfaz de BQ en lo que respecta a la programación. Y qué no.

yan

En respuesta a lemarcfj

De todos modos, no para este foro de PowerBI.

Investigue en línea o comuníquese con Stackoverflow. En este último, muestre señales de que intentó algo, ya que la comunidad está ahí para ayudar, no para brindar consultoría gratuita. Por cierto, muchos de nosotros tenemos sombreros híbridos, soy un asesor fiscal, así que vea esto como una oportunidad de aprendizaje. 😉

Buena suerte !

lemarcfj

En respuesta a yan

Hola,

Pude hacer que mi consulta funcionara en el lado de BQ, gracias por su sugerencia. No escribí personalmente la consulta, pero de todos modos funcionó.

Espero poder averiguar cómo se define / selecciona la clave principal para poder reutilizar la consulta para otras tablas para las que tengo este problema. Gracias de nuevo.

LeMarc

lemarcfj

En respuesta a v-yuezhe-msft

Gracias. Intenté agregar la columna calculada usando:

RANK = RANKX (FILTER (‘FB_ads_insights’, ‘FB_ads_insights'[campaign_name]= ANTES (‘FB_ads_insights'[campaign_name]) & ‘FB_ads_insights'[_sdc_sequence]= ANTES (‘FB_ads_insights'[_sdc_sequence])), ‘FB_ads_insights'[_sdc_batched_at],, DESC)

Y obtuve el siguiente error: Las operaciones de comparación de DAX no admiten la comparación de valores de tipo True / False con valores de tipo Text. Considere usar la función VALOR o FORMATO para convertir uno de los valores.

Observe que utilicé los nombres verdaderos de la tabla / columna aquí. ¿Qué columnas deben tener qué formato? Sdc_sequence viene como un número decimal pero se está convirtiendo a notación científica en Power BI (134343 + N) o como se llame. ¿Debería convertir eso a un formato diferente?

Greg_Deckler

Los datos de muestra y el resultado esperado ayudarían enormemente. ¿Importa si la solución está en DAX o Power Query? Consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

lemarcfj

En respuesta a Greg_Deckler

Disculpas por eso. No me importa lo que sea, siempre que obtenga lo que necesito. Me imagino que esto sería más una Power Query.

Los datos de muestra se pueden encontrar aquí.

En respuesta a lemarcfj

@lemarcfj,

¿Podría describir más detalles sobre la lógica que usa para obtener datos deducidos de la tabla sin procesar? Intento ejecutar la consulta SQL que proporcionaste, pero encontré que no hay una columna de identificación en el archivo de Excel de muestra.

Saludos,

Lydia

lemarcfj

En respuesta a v-yuezhe-msft

Entonces, esa consulta SQL fue solo una consulta de muestra que encontré en la publicación del blog de Slack aquí. En mi archivo de muestra, creo que la dimensión que nos gustaría usar en lugar de «id» sería el nombre de la campaña, ya que esa es la dimensión con la que me gustaría ver los datos y luego una métrica de gasto deducida.

lemarcfj

En respuesta a lemarcfj

Hola,

¡Sí! Como un FYI, esa consulta de muestra que proporcioné no tiene relación con mi conjunto de datos de muestra. La consulta debe adaptarse a mi conjunto de datos y a lo que espero lograr. Entonces, si bien la consulta logrará la deduplicación, no es una consulta que se haya creado específicamente para mí. Dicho eso si [Facebook Campaign] es mi dimensión principal.

Muchas gracias por su ayuda con esto.

En respuesta a lemarcfj

@lemarcfj ,

¿Podría describir la lógica que utiliza para obtener la fecha de datos duplicados basada en datos de muestra?

Saludos,
Lydia

lemarcfj

En respuesta a v-yuezhe-msft

Hola Lydia, avísame si esto ayuda:

Coge la última versión de cada fila

En cada tabla de integración generada por Stitch, verá algunas columnas precedidas de _sdc. La columna en la que nos centraremos aquí es la _sdc_sequence columna. Esta columna es una época de Unix (hasta el milisegundo) adjunta al registro durante la replicación y puede ayudar a determinar el orden de todas las versiones de una fila.

Stitch usa estos valores de secuencia en algunos lugares para ordenar correctamente las filas para la carga, pero también se puede usar para obtener la última versión de un registro en una tabla de solo anexión.

Echemos un vistazo a un ejemplo. Supongamos que tenemos un pedidos tabla que contiene:

  • Una clave principal de identificación,
  • El sistema _sdc columnas agregadas por Stitch, y
  • Otras columnas de atributos de orden

Si desea crear una instantánea de la última versión de esta tabla, puede ejecutar una consulta como esta:

    SELECT DISTINCT o.*
      FROM [stitch-analytics-bigquery-123:ecommerce.orders] o
INNER JOIN (
     SELECT id,
            MAX(_sdc_sequence) AS seq,
            MAX(_sdc_batched_at) AS batch
    FROM [stitch-analytics-bigquery-123:ecommerce.orders]
    GROUP BY id) oo
ON o.id = oo.id
AND o._sdc_sequence = oo.seq
AND o._sdc_batched_at = oo.batch

Este enfoque utiliza una subconsulta para obtener una lista única de la clave principal de cada fila, el número de secuencia máximo y el lote máximo en la marca de tiempo. Dado que es posible tener registros duplicados en su almacén, la consulta también selecciona solo registros distintos de la última versión de la fila. Luego une la tabla original a la Clave principal, la secuencia máxima y el lote máximo en, lo que hace que todos los demás valores de columna estén disponibles para consultas.

En respuesta a lemarcfj

@lemarcfj,

Quieres decir [Facebook Campaign]? Cuando ejecuto la consulta SQL a continuación en función de su tabla de muestra, no obtuve ningún resultado en

   SELECT DISTINCT o.*
      FROM [stitch-analytics-bigquery-123:ecommerce.orders] o
INNER JOIN (
     SELECT [Facebook Campaign],
            MAX(_sdc_sequence) AS seq,
            MAX(_sdc_batched_at) AS batch
    FROM [stitch-analytics-bigquery-123:ecommerce.orders]
    GROUP BY [Facebook Campaign]) oo
ON o.[Facebook Campaign] = oo.[Facebook Campaign]
AND o._sdc_sequence = oo.seq
AND o._sdc_batched_at = oo.batch

1.PNG

Saludos,
Lydia

Deja un comentario

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