Elimine duplicados y conserve el último registro con Power Query 🏆

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Aprenda a eliminar duplicados y mantenga el último registro en la consulta de energía.

Hoy estaba ayudando a un cliente con un problema que parecía bastante simple en la superficie. Tenía una tabla de datos que contenía los pedidos de ventas de los clientes históricos (cada cliente tiene muchos pedidos en diferentes fechas). El objetivo era filtrar esta tabla en Power Query y solo cargar un registro para cada cliente, el que era la fecha del último pedido. Para ilustrar el problema más claramente, he adaptado el escenario usando la base de datos de Adventure Works para que pueda eliminar duplicados y mantener el último registro en la consulta de energía.

Ejemplo de Adventure Works

La tabla de ventas contiene todas las transacciones de ventas históricas por cliente (identificadas por CustomerKey) y cada transacción tiene una fecha de pedido. El objetivo es filtrar esta tabla en Power Query para mantener solo la última entrada de cada cliente (la última entrada es la fecha de pedido más reciente). En primera instancia, la solución parece sencilla. En Power Query, pensaría que simplemente:

  • Ordene la tabla por Fecha de pedido en orden descendente.
  • Seleccione la columna de la clave del cliente y luego elimine los duplicados.

Pero cuando hace esto en Power Query, no funciona como se esperaba. Como puedes ver en En la tabla de Ventas a continuación, cada cliente tiene muchas transacciones con diferentes fechas de pedido.

removing-duplicates-1-9869227

En Power Query, ordené por OrderDate de forma descendente, luego eliminé los duplicados como se muestra a continuación.

removing-duplicates-3-1-1024x337-9189048

Pero la solución no es correcta: las fechas de pedido de algunos de los clientes en realidad no son los últimos pedidos. La tabla de la izquierda a continuación muestra los datos originales ordenados por OrderDate para cada cliente. La tabla de la derecha a continuación muestra los resultados de la consulta de energía. Si compara los datos completos de la izquierda con los resultados de Power Query de la derecha, puede ver que PQ ha devuelto la fecha de pedido incorrecta para algunos clientes.

removing-duplicates-expected-incorrect-8979428

¿Por qué no funciona?

No puedo decir que tenga una comprensión técnica profunda del problema, pero tengo una comprensión conceptual. Cuando selecciona «ordenar columna», es razonable esperar que toda la tabla esté ordenada antes de continuar con el siguiente paso. En realidad, solo se ordenan los datos que se cargan en la memoria. Los datos restantes en el disco no se incluyen en la clasificación. Power Query también utiliza un concepto llamado «evaluación diferida». En resumen, esto significa que si agrega un paso en el código, y ese paso no es técnicamente necesario para producir el resultado final, entonces ese paso en realidad nunca se ejecuta (a pesar de que está allí en las instrucciones) – extraño, lo sé, pero muy eficiente.

Table.Buffer al rescate

Antes de compartir esta solución, permítame señalar que hay otras formas de resolver el problema, específicamente usando agrupar por. Sin embargo, el propósito de este artículo es ampliar la comprensión de los lectores sobre Power Query e introducir la función table.buffer.

Estoy bastante seguro de que aprendí este consejo de Imke Feldman en The BIccountant (o posiblemente Chris Webb). Ambos son auténticos sabios en estas cosas. Para resolver el problema, deberá ingresar y realizar algunos cambios manuales en el código M. Para hacer esto, primero asegúrese de activar la barra de fórmulas. Vaya al menú Ver y seleccione «barra de fórmulas».

removing-duplicates-formula-bar-3118629

Cuando hago clic en el paso que ordena la tabla (desc) por OrderDate, el código M era el siguiente:

removing-duplicates-4-5781958

Para resolver el problema, necesito forzar a Power Query a cargar todos los datos en la memoria, lo que obliga a completar la clasificación ahora antes de continuar. Todo lo que hice fue envolver la línea de código de arriba dentro de la función Table.Buffer () como se muestra a continuación.

removing-duplicates-5-8805342

El resto de los pasos siguen siendo los mismos. La función Table.Buffer () obliga a que todo el conjunto de datos se cargue en la memoria después de la clasificación y, por lo tanto, el siguiente paso para eliminar duplicados funciona correctamente en todo el conjunto de datos.

La tabla resultante tiene el siguiente aspecto:

removing-duplicates-2-1-1024x353-5202852

Estos resultados ahora son correctos, como puede ver en la siguiente tabla. La columna OrderDate (Solución incorrecta) es el resultado sin usar Table.Buffer () y la columna OrderDate (Solución correcta) es el resultado de usar Table.Buffer (). Puede ver que varios clientes tienen resultados diferentes. El resultado correcto se puede validar manualmente con los datos brutos.

removing-duplicates-solution-1-8805045

Aquí está el workbook de muestra y los datos de origen que utilicé en esta publicación de blog.

Muestra de eliminación de duplicados

!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window,document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘639916389503636’);
fbq(‘track’, ‘PageView’);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.