BASE DE CONOCIMIENTO

Agrupar valores consecutivos en función de una condición


Publicado: 16 Feb 2018
Fecha de la última modificación: 13 Sep 2023

Pregunta

Cómo agrupar valores consecutivos que cumplen con una condición o, mejor dicho, todos los valores que pertenecen a la misma línea.

Por ejemplo, crear grupos para días en función del número de días consecutivos que obtuvieron ganancias negativas. Si hay 3 días seguidos en una fila con ganancias negativas, esos días pertenecerán al grupo "3".

Entorno

  • Tableau Desktop
  • Opcional: Tableau Prep

Respuesta

Las siguientes instrucciones, con Superstore del conjunto de datos de muestra, se demuestran en el libro de trabajo "ejecución de grupos de conteo_v2021.1.twbx" que se puede descargar en el panel derecho.

Estas direcciones crean una tabla resaltada que cuenta el número de líneas en cada grupo. Por ejemplo, ¿cuántas líneas de 3 días de ganancias negativas hay en el conjunto de datos? Además, el libro de trabajo incluye instrucciones para crear una vista de tabulación cruzada y de gráfico de Gantt.

Opción 1: usar PREVIOUS_VALUE() en Tableau Desktop

Para buscar la fecha de inicio para un grupo de días consecutivos revise si el día de hoy cumple con la condición (tiene una ganancia negativa) y si el día anterior no cumple con la condición. Al usar la función PREVIOUS_VALUE() se puede repetir el valor de fecha de inicio para todos los días del grupo. Luego, se puede buscar la fecha de finalización con un proceso similar, pero los datos se leen de fecha más antigua a más reciente.

crear los cálculos

  1. Opcional: cree un campo calculado con un nombre como "Ganancias sin brechas" con un cálculo similar al siguiente:
    ZN(LOOKUP(SUM([Profit]),0))
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    
    Nota: si al conjunto de datos le faltan días, este paso permitirá tratar los días faltantes como cero ganancias. Si omite este paso, use SUM([Ganancias]) en lugar de [Ganancias sin brechas] en todos los pasos siguientes.
     
  2. Cree un campo calculado con un nombre como "Fecha de inicio" con un cálculo similar al siguiente:
        IF [Profit no gaps] >= 0
    	THEN NULL
    	
    	ELSEIF LOOKUP([Profit no gaps],-1) >= 0
    	THEN MIN([Fecha de pedido])
    	
    	ELSE PREVIOUS_VALUE(#1/1/18#)
    	END
    
    
  3. Cree un campo calculado con un nombre como "Próximo valor de ganancias" con un cálculo similar al siguiente:
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
        LOOKUP([Profit no gaps],1)
         (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
  4. Cree un campo calculado con un nombre como "Fecha de finalización" con un cálculo similar al siguiente:
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    	IF [Profit no gaps] >= 0
    	THEN NULL
    	
    	ELSEIF [Próximo valor de ganancias] >= 0
    	THEN MIN([Fecha de pedido])
    	
    	ELSE PREVIOUS_VALUE(#1/1/18#)
    	END 
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    
  5. Cree un campo calculado con un nombre como "Días en línea" con un cálculo similar al siguiente:
    	 (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
        DATEDIFF('day', [Fecha de inicio], [Fecha de finalización]) + 1
         (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
  6. Cree un campo calculado con un nombre como "Número de líneas" con un cálculo similar al siguiente:
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
        IF [Días en línea] = 1 THEN
    	    WINDOW_SUM(
    	    IF [Días en línea] = 1
    	    THEN COUNTD([Fecha de pedido])
    	    END
    	    )
    	ELSEIF [Días en línea] = 2 THEN
    	    WINDOW_SUM(
    	    IF [Días en línea] = 2
    	    THEN COUNTD([Fecha de pedido])
    	    END
    	    )
    	ELSEIF [Días en línea] = 3 THEN
    	    WINDOW_SUM(
    	    IF [Días en línea] = 3
    	    THEN COUNTD([Fecha de pedido])
    	    END
    	    )
    	ELSEIF ...
    	END / [Días en línea]    
     

    Nota: los campos calculados [Número de líneas] y [Mantener una sola fecha por grupo de líneas] deben incluir una condición para todos los números de día posibles en una línea. Para obtener más información sobre el motivo, consulte el artículo Usar un campo agregado para definir el nivel de detalle en un cálculo de tabla

  7. Cree un campo calculado con un nombre como "Mantener una sola fecha por grupo de líneas" con un cálculo similar al siguiente:
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
        MIN([Fecha de pedido]) = WINDOW_MIN(IF[Días en línea] = 1 THEN [Fecha de inicio] END)
    	OR MIN([Fecha de pedido]) = WINDOW_MIN(IF[Días en línea] = 2 THEN [Fecha de inicio] END)
    	OR MIN([Fecha de pedido]) = WINDOW_MIN(IF[Días en línea] = 3 THEN [Fecha de inicio] END)
    	OR ...
    


Crear una tabla de resaltado

  1. Arrastre [Categoría] al estante Columnas
  2. Haga clic con el botón derecho y arrastre [Fecha de pedido] hasta Detalle en la tarjeta Marcas
  3. En el cuadro de diálogo Dejar campo, seleccione MDY(Fecha de pedido) y haga clic en Aceptar
  4. Arrastre [Días en línea] hasta Etiqueta en la tarjeta Marcas
  5. Haga clic con el botón derecho en [Días en línea] en Etiqueta y seleccione Editar cálculo de tabla...
  6. En el cuadro de diálogo Cálculo de tabla, haga lo siguiente:
    1. En Cálculos anidados, seleccione Fecha de inicio
    2. En Calcular usando, seleccione “Dimensiones específicas”.
    3. Marque únicamente el mes, día y año de la fecha de pedido
    4. En Cálculos anidados, seleccione Ganancias sin brechas
    5. En Calcular usando, seleccione “Dimensiones específicas”.
    6. Desmarque todas las dimensiones
    7. En Cálculos anidados, seleccione Próximo valor de ganancias
    8. En Calcular usando, seleccione “Dimensiones específicas”.
    9. Marque únicamente el mes, día y año de la fecha de pedido
    10. En Cálculos anidados, seleccione Fecha de inicio.
    11. En Calcular usando, seleccione “Dimensiones específicas”.
    12. Marque únicamente el mes, día y año de la fecha de pedido
    13. En el menú desplegable Criterio de ordenamiento, seleccione .Personalizar, Fecha de pedido, Mínimo, Descendente
  7. Pulse Ctrl y arrastre [Días en línea] de Etiqueta hasta el estante Filas
  8. Haga clic con el botón derecho en [Días en línea] en el estante Filas y seleccione Discreto
  9. Arrastre [Mantener una sola fecha por grupo de líneas] al estante Filtros y haga clic en Aceptar para cerrar el cuadro de diálogo Filtro
  10. Haga clic con el botón derecho en [Mantener una sola fecha por grupo de líneas] en el estante Filtros y seleccione Editar cálculo de tabla...
  11. En el cuadro de diálogo Cálculo de tabla, haga lo siguiente:
    1. Repita los pasos 6-1 a 6-13
    2. En Cálculos anidados, seleccione Mantener una sola fecha por grupo de líneas
    3. En Calcular usando, seleccione “Dimensiones específicas”.
    4. Marque únicamente el mes, día y año de la fecha de pedido
  12. Haga clic con el botón derecho en [Mantener una sola fecha por grupo de líneas] en el estante Filtros y seleccione Editar filtro. En el cuadro de diálogo Filtro, marque solo Verdadero y haga clic en Aceptar
  13. Pulse Ctrl y arrastre [Días en línea] del estante Filas hasta Color en la tarjeta Marcas
  14. En el menú desplegable de la tarjeta Marcas, seleccione Cuadrado
  15. Haga clic en Tamaño en la tarjeta Marcas y ajuste el control deslizante hasta la derecha
  16. Cree un campo calculado con un nombre como "En blanco" con un cálculo similar al siguiente:
    
    ""
     (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    
  17. Arrastre una copia de [En blanco] hasta el estante Filas, y otra hasta el estante Columnas
  18. Haga clic con el botón derecho en [En blanco] en el estante Filas y desmarque Mostrar encabezado.
 

Opción 2: usar Tableau Prep

Crear el flujo de preparación es más trabajo con anticipación, pero desarrollar las vistas de la salida de preparación es mucho más simple que crear vistas con cálculos de tabla. El flujo de preparación "Agrupar días consecutivos.tflx" demuestra los siguientes pasos y se puede descargar en el panel derecho.

Crear el flujo de preparación

  1. Conéctese a Superstore y arrastre Pedidos hasta el lienzo
  2. Opcional: siga las instrucciones en Completar espacios vacíos en datos secuenciales o Completar espacios vacíos en datos secuenciales por categoría para completar los días faltantes en el conjunto de datos
  3. Cree un paso de limpieza con el nombre "Sucursal principal"
  4. Cree un paso de agregación con el nombre "Mantener solamente los campos"
  5. En el paso de agregación "Mantener solamente los campos", agregue Categoría y Fecha de pedido a Campos agrupados y SUM(Ganancias) a Campos agregados
  6. Cree un paso de limpieza con el nombre "Número de fila"
  7. En el paso de limpieza "Número de fila", realice lo siguiente:
    1. Haga clic en Crear campo calculado... para crear un nuevo cálculo
    2. Asigne un nombre al cálculo "Condición"
    3. Agregue la fórmula para la condición que se usa para los días agrupados. Por ejemplo,
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      IF [Ganancias] < 0
      THEN 'negativo'
      ELSE 'positivo'
      END
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    4. Cree un nuevo campo calculado denominado "Número de fila" con una fórmula del siguiente tipo
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      { PARTITION [Categoría], [Condición] : { ORDERBY [Fecha de pedido] ASC : RANK_DENSE()}}
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
  8. Cree un paso de limpieza con el nombre "Número de fila + 1"
  9. En el paso de limpieza "Número de fila + 1", realice lo siguiente:
    1. Cree un nuevo campo calculado denominado "Número de fila + 1" con una fórmula del siguiente tipo 
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      [Número de fila] + 1
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    2. Elimine [Número de fila].
  10. Arrastre el paso de limpieza "Número de fila + 1" al paso de limpieza "Número de fila" y suéltelo en Unión
  11. En el paso de unión de columnas "Unión 1", haga lo siguiente:
    1. Tableau Prep crea automáticamente una cláusula de unión en Condición = Condición, si no agrega está cláusula de unión
    2. Haga clic en el símbolo de suma en el panel gris del lado izquierdo en la sección Cláusulas de unión de columnas aplicadas
    3. En el menú "Número de fila", seleccione Categoría
    4. En el menú "Número de fila + 1", seleccione Categoría
    5. Agregue otra cláusula de unión a Número de fila = Número de fila + 1
    6. En el diagrama de Venn, seleccione todos los círculos de "Número de fila" para una unión de columnas izquierda
  12. Cree un paso de limpieza con el nombre "Fecha de inicio"
  13. En el paso de limpieza "Fecha de inicio", realice lo siguiente:
    1. Haga clic en [Categoría] y, luego, pulse Ctrl para hacer clic en [Categoría-1] y seleccionar ambos campos
    2. Haga clic en Fusionar campos
    3. Fusione [Condición] y [Condición-1]
    4. Cree un nuevo campo calculado denominado "Fecha de inicio" con una fórmula del siguiente tipo 
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      IF ISNULL(DATEDIFF('day', [Fecha de pedido-1], [Fecha de pedido]))
      OR DATEDIFF('day', [Fecha de pedido-1], [Fecha de pedido]) > 1
      THEN [Fecha de pedido]
      END
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    5. Haga clic en Filtrar valores…
    6. En el cuadro de dialogo Agregar filtro, agregue una fórmula similar a NOT ISNULL([Fecha de inicio]) y haga clic en Guardar
    7. Cree un nuevo campo calculado denominado "Rango de fecha de inicio" con una fórmula del siguiente tipo 
      { PARTITION [Categoría], [Condición] : { ORDERBY [Fecha de inicio] ASC: RANK_DENSE()}}
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      
    8. Elimine [Número de fila], [Número de fila + 1], [Fecha de pedido], [Fecha de pedido-1]
  14. Pase el cursor sobre el paso de limpieza "Número de fila" y haga clic en el símbolo de suma del paso (no el símbolo de suma incrustado en una línea) para crear un nuevo paso de limpieza denominado "Número de fila - 1" que creará una sucursal independiente.
  15. Nota: los pasos 15-19 son similares a los pasos 9-13, pero con algunas diferencias para encontrar la fecha de finalización, en lugar de la fecha de inicio. No copie los campos calculados de la sucursal "Fecha de inicio" ya que hay diferencias. En el paso de limpieza "Número de fila - 1", realice lo siguiente:
    1. Cree un nuevo campo calculado denominado "Rango de fecha de inicio" con una fórmula del siguiente tipo 
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      [Número de fila] - 1
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      
    2. Elimine [Número de fila].
  16. Arrastre el paso de limpieza "Número de fila - 1" al paso de limpieza "Número de fila" y suéltelo en Unión
  17. En el paso de unión de columnas "Unión 2", haga lo siguiente:
    1. Cree cláusulas de unión de columnas en = Número de fila - 1; Categoría = Categoría; Condición = Condición
    2. En el diagrama de Venn, seleccione todos los círculos de "Número de fila" para una unión de columnas izquierda
  18. Cree un paso de limpieza con el nombre "Fecha de finalización"
  19. En el paso de limpieza "Fecha de finalización", realice lo siguiente:
    1. Fusione [Categoría] y [Categoría-1] 
    2. Fusione [Condición] y [Condición-1]
    3. Cree un nuevo campo calculado denominado "Fecha de finalización" con una fórmula del siguiente tipo
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      IF ISNULL(DATEDIFF('day', [Fecha de pedido], [Fecha de pedido-1]))
      OR DATEDIFF('day', [Fecha de pedido], [Fecha de pedido-1]) > 1
      THEN [Fecha de pedido]
      END
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    4. Agregue un filtro con una fórmula similar a NOT ISNULL([Fecha de finalización])
    5. Cree un nuevo campo calculado denominado "Rango de fecha de finalización" con una fórmula del siguiente tipo 
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      { PARTITION [Categoría], [Condición] : { ORDERBY [Fecha de finalización] ASC: RANK_DENSE()}}
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    6. Elimine [Número de fila], [Número de fila + 1], [Fecha de pedido], [Fecha de pedido-1]
  20. Arrastre el paso de limpieza "Fecha de finalización" sobre el paso de limpieza "Fecha de inicio" hasta Unión de columnas
  21. En Unión 3, cree cláusulas de unión de columnas para Condición = Condición; Categoría = Categoría; Rango de fecha de finalización = Rango de fecha de finalización
  22. Cree un paso de limpieza con el nombre "Limpieza"
  23. En el paso de limpieza "Limpieza", realice lo siguiente:
    1. Fusione [Categoría] y [Categoría-1]
    2. Fusione [Condición] y [Condición-1]
    3. Cree un nuevo campo calculado denominado "Número de días continuos" con una fórmula del siguiente tipo 
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
      DATEDIFF('day', [Fecha de inicio], [Fecha de finalización])+1
      
       (Se produjo un error al comunicarse con Microsoft Excel Reader. No es posible conectarse al servidor. Compruebe que el servidor está en ejecución y que usted tiene los permisos necesarios para acceder a la base de datos. Se agotó el tiempo de espera)
    4. Elimine [Rango de fecha de inicio] y [Rango de fecha de finalización]
  24. Arrastre el paso de limpieza "Limpieza" sobre el paso de limpieza "Sucursal principal" hasta Unión de columnas
  25. En Unión 4, cree cláusulas de unión de columnas para Categoría = Categoría; Fecha de pedido >= Fecha de inicio; Fecha de pedido <= Fecha de finalización
  26. Cree un paso de limpieza con el nombre "Limpieza final"
  27. En el paso de limpieza "Limpieza final", realice lo siguiente:
    1. Fusione [Categoría] y [Categoría-1]
  28. Opcional: Haga clic en Arrastrar para seleccionar todos los pasos en el lado de sucursal, haga clic con el botón derecho en cualquier paso destacado y seleccione Grupo

Crear el gráfico destacado

  1. Arrastre [Categoría] al estante Columnas
  2. Arrastre [Número de días continuos] al estante Filas
  3. Haga clic con el botón derecho en SUM(Número de días continuos) en el estante Filas y seleccione Dimensión
  4. Haga clic con el botón derecho en [Número de días continuos] en el estante Filas y seleccione Discreto
  5. Haga clic con el botón derecho y arrastre [Fecha de inicio] a Texto
  6. En el menú Anular campo, seleccione CNTD(Fecha de inicio) y haga clic en Aceptar
  7. Pulse Ctrl y arrastre CNTD(Fecha de inicio) de Etiqueta a Color en la tarjeta Marcas
  8. En el menú desplegable en la tarjeta Marcas, seleccione Cuadrado
  9. Arrastre [Condición] al estante Filtros
  10. En el cuadro de diálogo Filtro, seleccione "negativo" y haga clic en Aceptar
  11. En el menú desplegable Ajuste donde dice "Estándar", seleccione Ajustar anchura

Información adicional

Notas sobre la opción 1 con PREVIOUS_VALUE()
  • El cálculo [Fecha de inicio] devuelve NULO si no se cumple la condición (las ganancias son negativas). Luego, el cálculo comprueba si la condición no se cumplió el día anterior, de ser así, devuelve el valor de fecha de pedido. Por último, si el día de hoy y el día anterior cumplen con la condición entonces el cálculo usa PREVIOUS_VALUE() para devolver la fecha de este cálculo en la fila anterior. En otras palabras, a medida que Tableau Desktop lee cada fila (es decir, cada día), este cálculo devuelve NULO, ese valor de la fecha de pedido, o repetirá el valor de la fecha de pedido que devolvió previamente.
  • Todos los cálculos de tabla en esta vista se deben calcular correctamente para mostrar los valores esperados. Consulte Transformar valores con cálculos de tabla para obtener más información sobre cómo al calcular mediante cambios de configuración genera un cálculo de tabla.
  • A diferencia de LOOKUP(), la función PREVIOUS_VALUE() devolverá el último valor de este cálculo
Notas sobre la opción 2 con Tableau Prep:
  • La salida de flujo de Prep incluye fechas de inicio para agrupaciones que cumplen la condición (tiene ganancias negativas) y que no cumplen con la condición. Se puede agregar un filtro al paso de limpieza "Número de fila" para mantener solo [Condición]='negativa' para excluir grupos que no cumplen con la condición; de lo contrario, se debe agregar el filtro [Condición] a la vista.

     

Transformar valores con cálculos de tabla
Funciones de cálculo de tabla
¿Fue de ayuda este artículo para resolver el problema?