Prácticas recomendadas para crear cálculos en Tableau

En este artículo se describen varios consejos y pautas para crear cálculos eficaces en Tableau. Estas pautas están pensadas para ayudarle a optimizar el rendimiento de sus libros de trabajo. Para obtener más información sobre los distintos modos en que puede mejorar el rendimiento de los libros de trabajo, consulte la serie Optimizar el rendimiento de los libros de trabajo.

Regla general: evite usar un campo calculado varias veces en otro cálculo

Si hace referencia al mismo campo calculado varias veces dentro de otro cálculo, se producirán problemas de rendimiento. Si usa un campo calculado dentro de un cálculo (lo que también se conoce como crear un cálculo anidado), trate de hacer referencia a él solo una vez en el cálculo.

Tenga en cuenta que hacer referencia a un campo (campo terminal) varias veces en un cálculo no debería repercutir negativamente en el rendimiento.

Ejemplo

Supongamos que crea un campo calculado que usa un cálculo complicado de varias líneas para encontrar menciones, o nombres de usuario de Twitter, en tuits. El campo calculado se llama "Twitter Handle" (Nombre de usuario de Twitter). Cada nombre de usuario empieza con el símbolo "@" (por ejemplo: @usuario).

Para el análisis, tendrá que eliminar el símbolo "@".

Para ello, puede emplear el siguiente cálculo a fin de eliminar el primer carácter de la cadena:

RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)

Este cálculo es bastante sencillo. Sin embargo, como hace referencia al cálculo Twitter Handle dos veces, efectúa el cálculo en dos ocasiones para cada registro de su fuente de datos: una vez para la función RIGHT y otra para LEN.

A fin de no efectuar el mismo cálculo más de una vez, puede rescribir el cálculo de modo que utilice el campo calculado Twitter Handle en una sola ocasión. En este ejemplo, puede usar MID para lograr el mismo objetivo:

MID([Twitter Handle], 2)

Consejo 1: convierta varias comparaciones de igualdad a un grupo o una expresión CASE

Supongamos que tiene el siguiente cálculo, que utiliza el campo calculado Person (calc.) varias veces y emplea una serie de funciones OR. Este cálculo, a pesar de tratarse de una sencilla expresión lógica, ocasionará problemas de rendimiento en las consultas porque realiza el cálculo Person (calc.) al menos diez veces.

IF [Person (calc)] = 'Henry Wilson'
OR [Person (calc)] = 'Jane Johnson'
OR [Person (calc)] = 'Michelle Kim'
OR [Person (calc)] = 'Fred Suzuki'
OR [Person (calc)] = 'Alan Wang'
THEN 'Lead'
ELSEIF [Person (calc)] = 'Susan Nguyen'
OR [Person (calc)] = 'Laura Rodriguez'
OR [Person (calc)] = 'Ashley Garcia'
OR [Person (calc)] = 'Andrew Smith'
OR [Person (calc)] = 'Adam Davis'
THEN 'IC'
END

En lugar de utilizar una expresión de igualdad, pruebe las siguientes soluciones.

Solución 1

Use una expresión CASE. Por ejemplo:

CASE [Person (calc)]
WHEN 'Henry Wilson' THEN 'Lead'
WHEN 'Jane Johnson' THEN 'Lead'
WHEN 'Michelle Kim' THEN 'Lead'
WHEN 'Fred Suzuki' THEN 'Lead'
WHEN 'Alan Wang' THEN 'Lead'

WHEN 'Susan Nguyen' THEN 'IC'
WHEN 'Laura Rodriguez' THEN 'IC'
WHEN 'Ashley Garcia' THEN 'IC'
WHEN 'Andrew Smith' THEN 'IC'
WHEN 'Adam Davis' THEN 'IC'
END

En este ejemplo, solo se hace referencia una vez al campo calculado Person (calc.). Por lo tanto, el cálculo solo se realiza en una ocasión. Además, las expresiones CASE están más optimizadas en el proceso de consulta, por lo que obtendrá una mejora de rendimiento adicional.

Solución 2

Cree un grupo en lugar de un campo calculado. Para obtener más información, consulte Agrupe los datos.

Consejo 2: convierta cálculos de varias cadenas en una sola expresión REGEXP

Nota: Los cálculos de REGEXP están disponibles solo al usar extracciones de datos de Tableau o cuando se haya conectado a fuentes de datos de archivos de texto, Hadoop Hive, Google BigQuery, PostgreSQL, Tableau Data Extract, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (versión 14.1 en adelante) y Oracle. Para obtener más información, consulte Funciones adicionales.


Ejemplo 1: CONTAINS

Supongamos que tiene el siguiente cálculo, que utiliza el campo calculado Category (calc.) varias veces. Este cálculo, a pesar de tratarse también de una sencilla expresión lógica, ocasionará problemas de rendimiento en las consultas porque realiza el cálculo Category (calc.) en varias ocasiones.

IF CONTAINS([Segment (calc)],'UNKNOWN')
OR CONTAINS([Segment (calc)],'LEADER')
OR CONTAINS([Segment (calc)],'ADVERTISING')
OR CONTAINS([Segment (calc)],'CLOSED')
OR CONTAINS([Segment (calc)],'COMPETITOR')
OR CONTAINS([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Puede usar una expresión de REGEXP para obtener los mismos resultados sin tantas repeticiones.

Solución

IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END


En el caso de cálculos de cadena que utilicen un patrón similar, puede utilizar la misma expresión de REGEXP.

Ejemplo 2: STARTSWITH

IF STARTSWITH([Segment (calc)],'UNKNOWN')
OR STARTSWITH([Segment (calc)],'LEADER')
OR STARTSWITH([Segment (calc)],'ADVERTISING')
OR STARTSWITH([Segment (calc)],'CLOSED')
OR STARTSWITH([Segment (calc)],'COMPETITOR')
OR STARTSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'

Solución

IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observe que en esta solución se utiliza el símbolo "^".

Ejemplo 3: ENDSWITH

IF ENDSWITH([Segment (calc)],'UNKNOWN')
OR ENDSWITH([Segment (calc)],'LEADER')
OR ENDSWITH([Segment (calc)],'ADVERTISING')
OR ENDSWITH([Segment (calc)],'CLOSED')
OR ENDSWITH([Segment (calc)],'COMPETITOR')
OR ENDSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Solución

IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observe que en esta solución se utiliza el símbolo "$".

Consejo 3: manipule las cadenas con REGEXP en lugar de LEFT, MID, RIGHT, FIND o LEN

Las expresiones regulares pueden ser una herramienta muy útil. A la hora de realizar manipulaciones complejas de cadenas, plantéese usar expresiones regulares. En muchos casos, al usar una expresión regular, obtendrá un cálculo más corto y eficiente. Para obtener más información sobre expresiones regulares, consulte la publicación Conviértase en un experto en expresiones regulares y transforme datos imperfectos(El enlace se abre en una ventana nueva) en el blog de Tableau.

Ejemplo 1

Supongamos que tiene el siguiente cálculo, que elimina los protocolos de las direcciones URL. Por ejemplo, "https://www.tableau.com" se convierte en "www.tableau.com".

IF (STARTSWITH([Server], "http://")) THEN
MID([Server], Len("http://") + 1)
ELSEIF(STARTSWITH([Server], "https://")) THEN
MID([Server], Len("https://") + 1)
ELSEIF(STARTSWITH([Server], "tcp:")) THEN
MID([Server], Len("tcp:") + 1)
ELSEIF(STARTSWITH([Server], "\\")) THEN
MID([Server], Len("\\") + 1)
ELSE [Server]
END

Solución

Puede simplificar el cálculo y mejorar el rendimiento utilizando una función REGEXP_REPLACE.

REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")

Ejemplo 2

Supongamos que tiene el siguiente cálculo, que indica la segunda parte de una dirección IPv4. Por ejemplo, "172.16.0.1" se convierte en "16".

IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END

Solución

Puede simplificar el cálculo y mejorar el rendimiento utilizando una función REGEXP_EXTRACT.

REGEXP_EXTRACT([Server], "\.([^\.]*)\.")

Consejo 4: no utilice conjuntos en los cálculos

Si está usando conjuntos en un cálculo, plantéese sustituirlos por un cálculo alternativo, aunque equivalente.

Ejemplo

Supongamos que tiene el siguiente cálculo, que usa el conjunto Top Customers (set).

IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END

Solución 1

Si el conjunto es simple, puede crear un campo calculado que indique el mismo resultado que el conjunto. Por ejemplo:

CASE [Customer Name]
WHEN 'Henry Wilson' THEN True
WHEN 'Jane Johnson' THEN True
WHEN 'Michelle Kim' THEN True
WHEN 'Fred Suzuki' THEN True
WHEN 'Alan Wang' THEN True
ELSE False
END


Nota: Se recomienda usar el patrón WHEN TRUE … ELSE en esta situación para evitar problemas de rendimiento derivados del uso de conjuntos. Sin embargo, este no es un patrón recomendado en la mayoría de las situaciones.

Solución 2

Si el conjunto es más complejo, plantéese crear un grupo que asigne todos los elementos del conjunto a un valor o atributo determinado, como "IN", y, después, modifique el cálculo para que busque dicho valor o atributo. Por ejemplo:

IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END

Para obtener más información, consulte Agrupe los datos y Crear conjuntos.

Consejo 5: no use conjuntos para agrupar los datos

Los conjuntos están pensados para realizar comparaciones en subconjuntos de datos. Los grupos están pensados para combinar miembros relacionados en un campo. No se recomienda convertir los conjuntos en grupos, como en el siguiente ejemplo:

IF [Americas Set] THEN "Americas"
ELSEIF [Africa Set] THEN "Africa"
ELSEIF [Asia Set] THEN "Asia"
ELSEIF [Europe Set] THEN "Europe"
ELSEIF [Oceania Set] THEN "Oceania"
ELSE "Unknown"
END

Esto no se recomienda por los siguientes motivos:

  • Los conjuntos no son siempre exclusivos. Algunos miembros pueden aparecer en varios conjuntos. Por ejemplo, Rusia podría aparecer en el conjunto Europa y en el de Asia.

  • Los conjuntos no siempre pueden traducirse en grupos. Si los conjuntos están definidos por exclusión, condiciones o límites, podría resultar difícil o incluso imposible crear un grupo equivalente.

Solución

Agrupe sus datos con la funcionalidad de agrupación. Para obtener más información, consulte Agrupe los datos.

Consulte también

Crear cálculos eficientes

Optimizar el rendimiento de los libros de trabajo

Tipos de cálculos en Tableau

Funciones en Tableau

¡Gracias por sus comentarios!Sus comentarios se han enviado correctamente. ¡Gracias!