Raíz n-ésima en Teradata.

En los cálculos habituales a los que estamos acostumbrados normalmente sólo se necesitan raíces cuadradas (y eso si alguna vez se necesitan). Para ello existe la función SQRT (square root) que es simple y sencilla.

SELECT SQRT(16);


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

              Sqrt(16)
----------------------
 4.00000000000000E 000

¿Pero qué pasa si queremos una raíz cúbica, cuarta o cualquier otra raíz n-ésima? Pues que entonces tenemos que buscar otro método.
Lo normal es utilizar una exponenciación inversa: SQRT(16)=16**(1/2)

Así que:

BTEQ -- Enter your SQL request or BTEQ command:
SELECT 243**(1/5);


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

          (243**(1/5))
----------------------
 1.00000000000000E 000

¿1? ¿Cómo es posible? Pues claro, porque 1/5 trunca a 0, y n**0 = 1.

Entonces hay que hacer un CAST para evitarlo:

SELECT 243**(1(FLOAT)/5);
                       $
 *** Failure 3706 Syntax error: expected something between ')' and '/'.
                Statement# 1, Info =24
 *** Total elapsed time was 1 second.

Con un CAST ‘TERADATA’ casca. Hay que hacer un CAST ‘ANSI’.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 243**CAST(1 AS FLOAT)/5;


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

          ((243**1)/5)
----------------------
 4.86000000000000E 001

Esto tampoco es lo que esperábamos. Pero aquí el problema está en la precedencia de operadores: se ejecuta primero 243**1 y luego se divide por 5.
Es decir: (243**1)/5 = 48.6

Así que lo mejor será utilizar los paréntesis con criterio:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 243**(CAST(1 AS FLOAT)/5);


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

          (243**(1/5))
----------------------
 3.00000000000000E 000

Y esto sí es lo que esperábamos.

Por último, aunque podemos utilizar la potenciación con números negativos:

SELECT (-2)**(3);


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

               (-2**3)
----------------------
-8.00000000000000E 000

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (-8)**(3);


 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

               (-8**3)
----------------------
-5.12000000000000E 002

No podemos hacer lo mismo con exponentes menores que 1:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT (-8)**(CAST(1 AS FLOAT)/3);

 *** Failure 2622 Bad argument for ** operator.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

También hay que tener en cuenta que estamos trabajando con FLOATs de doble precisión y sus posibles errores inherentes.

Saludos.

Carlos.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: