{"id":2532,"date":"2026-04-01T09:10:09","date_gmt":"2026-04-01T07:10:09","guid":{"rendered":"https:\/\/bicontrolling.com\/?p=2532"},"modified":"2026-04-01T09:21:48","modified_gmt":"2026-04-01T07:21:48","slug":"calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window","status":"publish","type":"post","link":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/","title":{"rendered":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: <strong>las funciones WINDOW<\/strong>. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados.<\/p>\n\n\n\n<p>Hasta ese momento, resolver c\u00e1lculos dependientes de posiciones relativas; el primer cliente, el anterior pedido, el siguiente valor en un ranking, implicaba recurrir a funciones como <code>TOPN<\/code> o <code>RANKX<\/code>, y a iteraciones anidadas.<\/p>\n\n\n\n<p>Estas funciones no ampl\u00edan realmente la capacidad expresiva de DAX, todo lo que hoy hacemos con estas funciones ya pod\u00eda hacerse antes, pero s\u00ed transforman la forma en que lo escribimos. Simplifican el c\u00f3digo, lo hacen m\u00e1s mantenible y, en muchos casos, m\u00e1s eficiente. Adem\u00e1s, introducen un concepto nuevo y fundamental en el lenguaje: <strong>apply semantics<\/strong>, al que seguramente dedicaremos otro art\u00edculo m\u00e1s adelante, que permite que dichas funciones interact\u00faen simult\u00e1neamente con el contexto de fila y el contexto de filtro.<\/p>\n\n\n\n<p>En este art\u00edculo vamos a aplicar estas funciones a un caso de negocio muy habitual: la <strong>identificaci\u00f3n de clientes nuevos, perdidos y recuperados<\/strong>. Un problema cl\u00e1sico en an\u00e1lisis comercial que, gracias a estas funciones puede resolverse hoy con un rendimiento, claridad y precisi\u00f3n muy superiores a los patrones tradicionales.<\/p>\n\n\n\n<p>Aunque el foco estar\u00e1 en clientes, el patr\u00f3n que construiremos <strong>es completamente generalizable<\/strong>. La misma l\u00f3gica puede aplicarse para detectar productos que dejan de venderse, productos reactivados, tiendas que inician o cesan actividad, comerciales que recuperan cartera&#8230;<\/p>\n\n\n\n<p>En los siguientes apartados veremos c\u00f3mo funcionan estas funciones y c\u00f3mo utilizarlas correctamente para construir un patr\u00f3n s\u00f3lido, reutilizable y eficiente.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Entendiendo las funciones WINDOW en DAX<\/h2>\n\n\n\n<p>Vamos a iniciar nuestra andadura con las funciones WINDOW y a centrarnos en las m\u00e1s importantes y las que primero se introdujeron: <strong>INDEX, OFFSET y WINDOW<\/strong>.<\/p>\n\n\n\n<p>Son <strong>funciones tabulares<\/strong>, es decir, nos devuelven una tabla, igual que FILTER, VALUES o ADDCOLUMNS. Su prop\u00f3sito es muy concreto: <strong>navegar sobre una tabla ordenada y particionada<\/strong>, es decir, dividida en bloques de filas, para extraer la fila o las filas que nos interesan.<\/p>\n\n\n\n<p>Una caracter\u00edstica diferencial es que la mayor\u00eda de sus argumentos son opcionales y est\u00e1n dise\u00f1adas para poder indicarlos en cualquier orden. Si nos fijamos en la sintaxis (ver imagen), las tres funciones comparten la misma estructura y funcionan siguiendo siempre el mismo proceso:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Toman todas las filas de la tabla que indiquemos en el par\u00e1metro <code>&lt;table&gt;<\/code>. Esta ser\u00e1 la <strong>tabla fuente<\/strong>.<\/li>\n\n\n\n<li>Dividen esas filas en particiones seg\u00fan las columnas indicadas en <code>&lt;partition-by&gt;<\/code>.<\/li>\n\n\n\n<li>Ordenan las filas dentro de cada partici\u00f3n seg\u00fan las columnas de <code>&lt;order-by&gt;<\/code>.<\/li>\n\n\n\n<li>Y finalmente, con el <strong>primer par\u00e1metro (el \u00fanico obligatorio)<\/strong> decidimos qu\u00e9 fila o filas queremos devolver.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"176\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=629%2C176&#038;ssl=1\" alt=\"\" class=\"wp-image-2539\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=1024%2C287&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=300%2C84&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=768%2C215&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=1536%2C430&amp;ssl=1 1536w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=900%2C252&amp;ssl=1 900w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?resize=1280%2C358&amp;ssl=1 1280w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?w=1833&amp;ssl=1 1833w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Pulsar en la imagen para agrandar<\/em><\/p>\n\n\n\n<div style=\"height:52px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Como vemos en la imagen, tenemos adem\u00e1s otro par\u00e1metro opcional, <code>&lt;blanks&gt;<\/code>, que permite indicar c\u00f3mo tratar los valores nulos al ordenar. De momento no entraremos en detalle en este y otros par\u00e1metros opcionales que vinieron despu\u00e9s, porque suficiente complejidad tienen ya estas funciones.<\/p>\n\n\n\n<p>La diferencia real entre las tres funciones est\u00e1 en el <strong>primer par\u00e1metro<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>INDEX<\/strong> solo puede devolver una fila, y lo hace indicando la posici\u00f3n absoluta dentro de la partici\u00f3n: primera fila, segunda fila, \u00faltima fila\u2026<\/li>\n\n\n\n<li><strong>OFFSET<\/strong> tambi\u00e9n devuelve una \u00fanica fila, pero la posici\u00f3n se especifica de forma relativa respecto a la fila actual: una fila anterior, tres filas antes, la siguiente fila\u2026<\/li>\n\n\n\n<li><strong>WINDOW<\/strong> va un paso m\u00e1s all\u00e1 y permite devolver un conjunto de filas, definiendo el l\u00edmite inferior y superior de la ventana. Esos l\u00edmites pueden indicarse tanto en valor absoluto (como INDEX) como en valor relativo (como OFFSET).<\/li>\n<\/ul>\n\n\n\n<p>Podemos ver un resumen en la siguiente imagen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"379\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?resize=629%2C379&#038;ssl=1\" alt=\"\" class=\"wp-image-2543\" style=\"aspect-ratio:1.659669054087429;width:425px;height:auto\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?resize=1024%2C617&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?resize=300%2C181&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?resize=768%2C463&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?resize=900%2C542&amp;ssl=1 900w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-6.png?w=1220&amp;ssl=1 1220w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Consideraciones respecto al rendimiento<\/h3>\n\n\n\n<p>Aunque en general el rendimiento de estas funciones es <strong>muy bueno<\/strong>, especialmente cuando necesitamos ordenar por varias columnas con valores discontinuos, conviene tener en cuenta algunos aspectos para no llevarnos una sorpresa, y no olvidar que, como siempre en DAX, cuando trabajamos con modelos exigentes <strong>medir el rendimiento de distintas alternativas es parte del trabajo.<\/strong><\/p>\n\n\n\n<p>La raz\u00f3n por la cual el rendimiento de estas funciones suele ser excelente, es porque nos permiten trabajar  <strong>sobre valores ya agregados<\/strong>, y no sobre la tabla de hechos a su <strong>m\u00e1xima granularidad<\/strong>. <\/p>\n\n\n\n<p>Para quienes conozcan la diferencia entre el <strong>Formula Engine<\/strong> y el <strong>Storage Engine<\/strong>, el punto clave es que las funciones WINDOW se ejecutan <strong>\u00edntegramente en el Formula Engine<\/strong>.<\/p>\n\n\n\n<p>Esto implica que el <strong>Formula Engine necesita una copia completa de las filas<\/strong> (y columnas) de la tabla que pasamos como par\u00e1metro <code>&lt;table&gt;<\/code>. Incluso en modelos import, no reutiliza directamente la estructura interna de VertiPaq, sino que crea sus propias <strong>estructuras en memoria (spools)<\/strong> para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>almacenar los datos de la tabla base,<\/li>\n\n\n\n<li>mapear las particiones,<\/li>\n\n\n\n<li>mantener arrays ordenados dentro de cada partici\u00f3n,<\/li>\n\n\n\n<li>y vincular la fila actual del contexto con su posici\u00f3n en esas estructuras.<\/li>\n<\/ul>\n\n\n\n<p>Cuantas m\u00e1s filas y m\u00e1s columnas tenga la tabla de entrada, <strong>mayor ser\u00e1 el consumo de memoria y el trabajo del Formula Engine<\/strong>.<\/p>\n\n\n\n<p>Por eso, en mi opini\u00f3n, estas funciones son especialmente \u00fatiles cuando la <strong>granularidad del c\u00e1lculo est\u00e1 bien definida<\/strong> y no va a ser modificada din\u00e1micamente por el usuario en la visualizaci\u00f3n.<\/p>\n\n\n\n<p>En escenarios donde el usuario puede <strong>cambiar la granularidad<\/strong>, hay que ser prudente. Dise\u00f1ar un patr\u00f3n con WINDOW que funcione correctamente para cualquier nivel de granularidad puede disparar el n\u00famero de filas que el Formula Engine necesita materializar, y el <strong>impacto en el rendimiento puede ser notable<\/strong>.<\/p>\n\n\n\n<p>Por \u00faltimo, si trabajamos en <strong>modo DirectQuery<\/strong>, las funciones WINDOW pueden ayudar significativamente, ya que es mucho m\u00e1s probable que las queries generadas por el motor utilicen las <strong>tablas de agregaciones<\/strong> que hayamos definido. Precisamente por la misma raz\u00f3n que coment\u00e1bamos antes: porque nos permiten trabajar sobre <strong>valores ya agregados<\/strong>, en lugar de forzar c\u00e1lculos a la m\u00e1xima granularidad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Modelando el ciclo de vida del cliente en DAX<\/h2>\n\n\n\n<p>Antes de meternos en arena, conviene detenerse en lo esencial: este tipo de c\u00e1lculos depende completamente de las <strong>reglas de negocio<\/strong> que definan qu\u00e9 entendemos por cliente nuevo, perdido o recuperado. La l\u00f3gica t\u00e9cnica es solo una traducci\u00f3n formal de esa definici\u00f3n. Si la definici\u00f3n cambia, el c\u00e1lculo cambia.<\/p>\n\n\n\n<p>Vamos a comenzar por los <strong>clientes nuevos<\/strong>, cuya interpretaci\u00f3n suele ser bastante homog\u00e9nea en la mayor\u00eda de organizaciones: consideraremos cliente nuevo a aquel que realiza una transacci\u00f3n por primera vez, sin haber registrado ninguna operaci\u00f3n en ning\u00fan momento anterior a esa fecha. Es decir, su aparici\u00f3n marca el inicio absoluto de su relaci\u00f3n comercial con la empresa. Si la granularidad temporal del c\u00e1lculo es anual, la f\u00f3rmula a implementar ser\u00eda la siguiente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Clientes Nuevos = \n\nVAR _PeriodoActual =\n    SELECTEDVALUE ( Calendario&#91;A\u00f1o&#93; )\nVAR _ClientesPeriodoActual =\n    CALCULATETABLE (\n        SUMMARIZE (\n            ALLSELECTED ( EntradaHoras ),\n            Clientes&#91;NombreComercial&#93;\n        ),\n        Calendario&#91;A\u00f1o&#93; = _PeriodoActual\n    )\nVAR _ClientesYaExistentes =\n    CALCULATETABLE (\n        SUMMARIZE (\n            ALLSELECTED ( EntradaHoras ),\n            Clientes&#91;NombreComercial&#93;\n        ),\n        WINDOW (\n            0,\n            ABS,\n            -1,\n            REL,\n            SUMMARIZE (\n                ALLSELECTED ( EntradaHoras ),\n                Calendario&#91;A\u00f1o&#93;\n            ),\n            ORDERBY ( Calendario&#91;A\u00f1o&#93;, ASC )\n        )\n    )\nVAR _ClientesNuevos =\n    EXCEPT (\n        _ClientesPeriodoActual,\n        _ClientesYaExistentes\n    )\nVAR _NumClientesNuevos =\n    COUNTROWS ( _ClientesNuevos )\n\nRETURN\n    _NumClientesNuevos<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">Nuevos<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_PeriodoActual<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">SELECTEDVALUE<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93; )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesPeriodoActual<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">CALCULATETABLE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">NombreComercial<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93; <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_PeriodoActual<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesYaExistentes<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">CALCULATETABLE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">NombreComercial<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">WINDOW<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">ABS<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">-<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">REL<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ORDERBY<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;, <\/span><span style=\"color: #E5C07B\">ASC<\/span><span style=\"color: #ABB2BF\"> )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesNuevos<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">EXCEPT<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesPeriodoActual<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesYaExistentes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_NumClientesNuevos<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">COUNTROWS<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">_ClientesNuevos<\/span><span style=\"color: #ABB2BF\"> )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">RETURN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">_NumClientesNuevos<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Esta medida calcula los <strong>clientes que aparecen por primera vez <\/strong>en el a\u00f1o seleccionado en el contexto de filtro. Para ello, primero obtiene los clientes con actividad en dicho a\u00f1o y despu\u00e9s, utilizando <strong>WINDOW<\/strong>, construye el conjunto de clientes que tuvieron actividad en cualquier a\u00f1o anterior. Finalmente, mediante <code>EXCEPT<\/code>, se queda \u00fanicamente con los que est\u00e1n en el periodo actual pero no exist\u00edan antes, y los cuenta con <code>COUNTROWS<\/code>.<\/p>\n\n\n\n<p>En el caso de los <strong>clientes perdidos<\/strong>, si consideramos que estos son aquellos que no han tenido actividad en el a\u00f1o visible en el contexto de filtro actual, pero si en el a\u00f1o inmediatamente anterior, deberemos calcular estas dos variables:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>VAR _ClientesPeriodoAnterior =\n    CALCULATETABLE (\n        SUMMARIZE (\n            ALLSELECTED ( EntradaHoras ),\n            Clientes&#91;NombreComercial&#93;\n        ),\n        WINDOW (\n            -1,\n            REL,\n            -1,\n            REL,\n            SUMMARIZE (\n                ALLSELECTED ( EntradaHoras ),\n                Calendario&#91;A\u00f1o&#93;\n            ),\n            ORDERBY ( Calendario&#91;A\u00f1o&#93;, ASC )\n        )\n    )\nVAR _ClientesPerdidos =\n    EXCEPT (\n        _ClientesPeriodoAnterior,\n        _ClientesPeriodoActual\n    )<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesPeriodoAnterior<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">CALCULATETABLE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">NombreComercial<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">WINDOW<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">-<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">REL<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">-<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">REL<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ORDERBY<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;, <\/span><span style=\"color: #E5C07B\">ASC<\/span><span style=\"color: #ABB2BF\"> )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesPerdidos<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">EXCEPT<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesPeriodoAnterior<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesPeriodoActual<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>En este caso, la l\u00f3gica es simplemente la inversa. <code>_ClientesPeriodoAnterior<\/code> obtiene, mediante <code>WINDOW<\/code>, los clientes que tuvieron actividad <strong>exclusivamente en el a\u00f1o inmediatamente anterior<\/strong> al visible en el contexto. La ventana <code>-1, REL, -1, REL<\/code> delimita precisamente ese \u00fanico periodo previo.<\/p>\n\n\n\n<p>Despu\u00e9s, <code>EXCEPT<\/code> elimina de ese conjunto los clientes que s\u00ed aparecen en el periodo actual. El resultado son aquellos que estaban activos el a\u00f1o pasado y <strong>ya no lo est\u00e1n en el actual<\/strong>.<\/p>\n\n\n\n<p>Por \u00faltimo, para los <strong>clientes recuperados<\/strong>, si entendemos estos como aquellos que han tenido actividad en el periodo seleccionado, no la tuvieron el a\u00f1o anterior, pero si en periodos anteriores a este, haremos lo siguiente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>VAR _ClientesYaExistentes =\n    CALCULATETABLE (\n        SUMMARIZE (\n            ALLSELECTED ( EntradaHoras ),\n            Clientes&#91;NombreComercial&#93;\n        ),\n        WINDOW (\n            0,\n            ABS,\n            -2,\n            REL,\n            SUMMARIZE (\n                ALLSELECTED ( EntradaHoras ),\n                Calendario&#91;A\u00f1o&#93;\n            ),\n            ORDERBY ( Calendario&#91;A\u00f1o&#93;, ASC )\n        )\n    )\nVAR _ClientesNuevos =\n    EXCEPT (\n        _ClientesPeriodoActual,\n        _ClientesPeriodoAnterior\n    )\nVAR _ClientesRecuperados =\n    INTERSECT (\n        _ClientesNuevos,\n        _ClientesYaExistentes\n    )<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesYaExistentes<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">CALCULATETABLE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">NombreComercial<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">WINDOW<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">ABS<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">-<\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">REL<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">SUMMARIZE<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ALLSELECTED<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">EntradaHoras<\/span><span style=\"color: #ABB2BF\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ORDERBY<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #E06C75\">Calendario<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">A\u00f1o<\/span><span style=\"color: #ABB2BF\">&#93;, <\/span><span style=\"color: #E5C07B\">ASC<\/span><span style=\"color: #ABB2BF\"> )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesNuevos<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">EXCEPT<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesPeriodoActual<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesPeriodoAnterior<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesRecuperados<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">INTERSECT<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesNuevos<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesYaExistentes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Para este c\u00e1lculo combinamos <strong>dos condiciones complementarias<\/strong>. Por un lado, identificamos los clientes que est\u00e1n activos en el periodo actual pero no en el anterior (<code>_ClientesNuevos<\/code>). Por otro, mediante <code>WINDOW<\/code>, obtenemos aquellos que tuvieron actividad en alg\u00fan periodo previo distinto del inmediatamente anterior (<code>_ClientesYaExistentes<\/code>).<\/p>\n\n\n\n<p>La intersecci\u00f3n de ambos conjuntos (<code>INTERSECT<\/code>) nos devuelve exactamente los clientes que <strong>han vuelto tras un periodo de inactividad<\/strong>. De nuevo, todo se resuelve comparando conjuntos temporales bien delimitados con la funci\u00f3n WINDOW.<\/p>\n\n\n\n<p>Conviene se\u00f1alar que este patr\u00f3n no se limita a devolver un <strong>recuento de clientes<\/strong>. Al trabajar con tablas intermedias que contienen expl\u00edcitamente los conjuntos resultantes, podemos tambi\u00e9n recuperar el <strong>detalle de los clientes<\/strong> que cumplen cada condici\u00f3n.<\/p>\n\n\n\n<p>Por ejemplo, en el caso de los clientes nuevos, bastar\u00eda con concatenar los nombres contenidos en la tabla <code>_ClientesNuevos<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>VAR _ClientesNuevosNombre =\n    CONCATENATEX (\n        _ClientesNuevos,\n        Clientes&#91;NombreComercial&#93;,\n        \", \"\n    )<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E5C07B\">VAR<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">_ClientesNuevosNombre<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">CONCATENATEX<\/span><span style=\"color: #ABB2BF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">_ClientesNuevos<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E06C75\">Clientes<\/span><span style=\"color: #ABB2BF\">&#91;<\/span><span style=\"color: #E06C75\">NombreComercial<\/span><span style=\"color: #ABB2BF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #98C379\">&quot;, &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    )<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>De esta forma podemos <strong>mostrar la evoluci\u00f3n temporal de las tres m\u00e9tricas<\/strong>; nuevos, perdidos y recuperados, en una visualizaci\u00f3n, y al mismo tiempo ofrecer el <strong>detalle de los nombres en un tooltip<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"316\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?resize=629%2C316&#038;ssl=1\" alt=\"\" class=\"wp-image-2554\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?resize=1024%2C515&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?resize=300%2C151&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?resize=768%2C387&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?resize=900%2C453&amp;ssl=1 900w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-8.png?w=1033&amp;ssl=1 1033w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:56px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Una ventaja adicional de este patr\u00f3n es que funciona correctamente bajo <strong>cualquier contexto de filtro<\/strong> definido por el usuario. Esto significa que podemos analizar clientes nuevos, perdidos o recuperados no solo a nivel global, sino tambi\u00e9n para un <strong>departamento concreto, un empleado, una tienda o cualquier <\/strong>combinaci\u00f3n de atributos dimensionales del modelo de datos. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Las <strong>funciones WINDOW<\/strong> aportan una forma m\u00e1s clara de resolver ciertos patrones que antes requer\u00edan l\u00f3gica m\u00e1s compleja y, en el escenario adecuado, pueden ofrecer un <strong>rendimiento extremadamente bueno<\/strong>. No hacen posible nada que no pudiera hacerse antes en DAX, pero permiten escribirlo de una manera m\u00e1s <strong>directa, estructurada y mantenible<\/strong>.<\/p>\n\n\n\n<p>El ejemplo de clientes nuevos, perdidos y recuperados es solo una aplicaci\u00f3n pr\u00e1ctica. El mismo planteamiento puede utilizarse para <strong>comparar estados, detectar cambios o analizar posiciones relativas<\/strong> dentro de cualquier conjunto ordenado, no necesariamente temporal.<\/p>\n\n\n\n<p>Como ocurre siempre en DAX, el resultado depende menos de la funci\u00f3n y m\u00e1s del <strong>dise\u00f1o del modelo<\/strong>: definir bien las <strong>reglas de negocio<\/strong>, trabajar a la <strong>granularidad adecuada<\/strong> y validar el rendimiento cuando el modelo lo exige. Cuando esas piezas est\u00e1n bien resueltas, las funciones WINDOW encajan de forma natural y simplifican notablemente el desarrollo de c\u00e1lculos complejos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2,3,4],"tags":[27,48,9,31,14,23,73],"post_series":[],"class_list":["post-2532","post","type-post","status-publish","format-standard","hentry","category-arquitectura-de-datos","category-controlling-dir-financiera","category-dax-power-pivot","tag-bi","tag-business-intelligence","tag-dax","tag-modelado-de-datos","tag-power-bi","tag-power-pivot","tag-window"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Admin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling\" \/>\n\t\t<meta property=\"og:description\" content=\"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-04-01T07:10:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-04-01T07:21:48+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#article\",\"name\":\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling\",\"headline\":\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW\",\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/bicontrolling.com\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/image-5.png?fit=1833%2C513&ssl=1\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#articleImage\",\"width\":1833,\"height\":513},\"datePublished\":\"2026-04-01T09:10:09+02:00\",\"dateModified\":\"2026-04-01T09:21:48+02:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#webpage\"},\"articleSection\":\"Arquitectura de datos, Controlling \\\/ Dir. Financiera, DAX, BI, business intelligence, DAX, Modelado de datos, Power BI, Power Pivot, WINDOW\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/bicontrolling.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"position\":2,\"name\":\"Arquitectura de datos\",\"item\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#listItem\",\"name\":\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#listItem\",\"position\":3,\"name\":\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/00c17f691e05a0999c7ea23a9ae4aa6e7ae25f55cd91ae9629fe81a02ae98278?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Admin\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#webpage\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/\",\"name\":\"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling\",\"description\":\"Introducci\\u00f3n Hace ya unos a\\u00f1os que Microsoft incorpor\\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\\u00f3nimas de SQL, dise\\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\\u00e1lculos dependientes de\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2026\\\/04\\\/01\\\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/vlozanoluque_sg8t8mat\\\/#author\"},\"datePublished\":\"2026-04-01T09:10:09+02:00\",\"dateModified\":\"2026-04-01T09:21:48+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling","description":"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de","canonical_url":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#article","name":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling","headline":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW","author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2026\/02\/image-5.png?fit=1833%2C513&ssl=1","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#articleImage","width":1833,"height":513},"datePublished":"2026-04-01T09:10:09+02:00","dateModified":"2026-04-01T09:21:48+02:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#webpage"},"isPartOf":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#webpage"},"articleSection":"Arquitectura de datos, Controlling \/ Dir. Financiera, DAX, BI, business intelligence, DAX, Modelado de datos, Power BI, Power Pivot, WINDOW"},{"@type":"BreadcrumbList","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","position":1,"name":"Inicio","item":"https:\/\/bicontrolling.com","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","position":2,"name":"Arquitectura de datos","item":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#listItem","name":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#listItem","position":3,"name":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW","previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}}]},{"@type":"Organization","@id":"https:\/\/bicontrolling.com\/#organization","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","url":"https:\/\/bicontrolling.com\/"},{"@type":"Person","@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author","url":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/","name":"Admin","image":{"@type":"ImageObject","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/00c17f691e05a0999c7ea23a9ae4aa6e7ae25f55cd91ae9629fe81a02ae98278?s=96&d=mm&r=g","width":96,"height":96,"caption":"Admin"}},{"@type":"WebPage","@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#webpage","url":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/","name":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling","description":"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/bicontrolling.com\/#website"},"breadcrumb":{"@id":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/#breadcrumblist"},"author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"creator":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/vlozanoluque_sg8t8mat\/#author"},"datePublished":"2026-04-01T09:10:09+02:00","dateModified":"2026-04-01T09:21:48+02:00"},{"@type":"WebSite","@id":"https:\/\/bicontrolling.com\/#website","url":"https:\/\/bicontrolling.com\/","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","inLanguage":"es-ES","publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","og:type":"article","og:title":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling","og:description":"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de","og:url":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/","article:published_time":"2026-04-01T07:10:09+00:00","article:modified_time":"2026-04-01T07:21:48+00:00","twitter:card":"summary","twitter:title":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW | Business Intelligence Controlling","twitter:description":"Introducci\u00f3n Hace ya unos a\u00f1os que Microsoft incorpor\u00f3 a DAX una nueva familia de funciones tabulares muy especiales: las funciones WINDOW. Se trata de funciones conceptualmente muy similares a las funciones hom\u00f3nimas de SQL, dise\u00f1adas para operar sobre conjuntos de datos previamente ordenados y, si es necesario, particionados. Hasta ese momento, resolver c\u00e1lculos dependientes de"},"aioseo_meta_data":{"post_id":"2532","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-02-21 11:15:34","updated":"2026-04-03 12:52:32","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/\" title=\"Arquitectura de datos\">Arquitectura de datos<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tCalculando clientes nuevos, perdidos y recuperados con funciones WINDOW\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/bicontrolling.com"},{"label":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},{"label":"Calculando clientes nuevos, perdidos y recuperados con funciones WINDOW","link":"https:\/\/bicontrolling.com\/index.php\/2026\/04\/01\/calculando-clientes-nuevos-perdidos-recuperados-con-funciones-window\/"}],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1769,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/12\/09\/crear-dimension-horaria-en-dax\/","url_meta":{"origin":2532,"position":0},"title":"Crear dimensi\u00f3n horaria en DAX","author":"Admin","date":"9 diciembre, 2020","format":false,"excerpt":"Introducci\u00f3n En una entrada anterior vimos c\u00f3mo, en escenarios donde tanto los atributos relacionados con la fecha como los relacionados con la hora son relevantes para el an\u00e1lisis que queremos realizar, pod\u00edamos crear una dimensi\u00f3n horaria en M que nos sirviera para filtrar y segmentar nuestras medidas en funci\u00f3n de\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":816,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/08\/23\/medidas-semi-aditivas-en-dax\/","url_meta":{"origin":2532,"position":1},"title":"Medidas semi-aditivas en DAX","author":"Admin","date":"23 agosto, 2018","format":false,"excerpt":"En cualquier sistema de BI, podemos crear c\u00e1lculos o medidas de 3 tipos distintos: Medidas aditivas: son generalmente la mayor parte de las medidas que nos encontraremos en un modelo de datos anal\u00edtico, y se caracterizan porque podemos usar la funci\u00f3n SUM() para agregar sus valores en funci\u00f3n de cualquier\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/04\/image-1-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/04\/image-1-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/04\/image-1-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/04\/image-1-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1951,"url":"https:\/\/bicontrolling.com\/index.php\/2022\/11\/12\/workshop-sobre-dax-en-power-bi-days-madrid\/","url_meta":{"origin":2532,"position":2},"title":"Workshop sobre DAX en Power BI Days Madrid","author":"Admin","date":"12 noviembre, 2022","format":false,"excerpt":"El viernes 25 de noviembre estar\u00e9 impartiendo un workshop sobre el lenguaje DAX en el evento Power BI Days de Madrid. \u00a1All\u00ed os espero!","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/03\/6.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/03\/6.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/03\/6.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/03\/6.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/03\/6.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1942,"url":"https:\/\/bicontrolling.com\/index.php\/2022\/04\/12\/video-power-bi-quizz-pensando-en-dax\/","url_meta":{"origin":2532,"position":3},"title":"Video Power BI Quizz Pensando en DAX","author":"Admin","date":"12 abril, 2022","format":false,"excerpt":"Os dejo el video de mi participaci\u00f3n en el Power BI Quizz de los grandes Ricardo Rinc\u00f3n y Raquel Alvear. Un autentico placer haber podido aportar mi granito de arena a esta iniciativa.","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/11\/Portada-Power-BI-Quizz.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":608,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/07\/25\/userelationship-en-columnas-calculadas\/","url_meta":{"origin":2532,"position":4},"title":"Uso de la funci\u00f3n USERELATIONSHIP en columnas calculadas","author":"Admin","date":"25 julio, 2018","format":false,"excerpt":"Introducci\u00f3n En un modelo tabular con relaciones inactivas podemos usar la funci\u00f3n USERELATIONSHIP() para activar una de ellas durante el tiempo de ejecuci\u00f3n de un determinado c\u00e1lculo con DAX. Para ello, simplemente tenemos que especificar dicha funci\u00f3n (y los par\u00e1metros correspondientes) como uno de los argumentos de filtro de la\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-121-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-121-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-121-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-121-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-121-1.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":141,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/04\/28\/seleccion-dinamica-de-medida-en-power-bi\/","url_meta":{"origin":2532,"position":5},"title":"Selecci\u00f3n din\u00e1mica de medida en Power BI","author":"Admin","date":"28 abril, 2018","format":false,"excerpt":"Un escenario com\u00fan a la hora de analizar datos es el querer mostrar distintas medidas evaluadas bajo el mismo contexto de filtro. Podemos hacer esto creando varias visualizaciones, cada una de ellas con una medida distinta. Una opci\u00f3n mejor, ya que hablamos del mismo contexto de filtro, ser\u00eda dejar al\u2026","rel":"","context":"En \u00abDAX\u00bb","block_context":{"text":"DAX","link":"https:\/\/bicontrolling.com\/index.php\/category\/dax-power-pivot\/"},"img":{"alt_text":"Tabla almac\u00e9n","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-11-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-11-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-11-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-11-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/comments?post=2532"}],"version-history":[{"count":20,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2532\/revisions"}],"predecessor-version":[{"id":2582,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/2532\/revisions\/2582"}],"wp:attachment":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/media?parent=2532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/categories?post=2532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/tags?post=2532"},{"taxonomy":"post_series","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/post_series?post=2532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}