SQL - calculo de 2 puntos en SQL

   
Vista:

calculo de 2 puntos en SQL

Publicado por Robertouf (2 intervenciones) el 06/11/2013 13:43:36
Hola buenos dias: tengo que calcular la distancia entre 2 puntos en una sentencia SQL y creo que algo no lo hago bien en su escritura. No llevo mucho tiempo en esto y estoy que no veo ya.

Yo pongo :

(SQRT(abs(substr(m.x,1,6)-substr(t.x,1,6))*2) + (abs(substr(m.y,1,7)-substr(t.y,1,7))*2)) as DISTANCIA

pero el valor que devuelve no debe ser ese

La formula real es Raiz Cuadrada(x2-x1)*2+(y2-y1)*2

Pongo en valor absoluto xq pueden salir valores negativos y me interesa realmente su absoluto.


Muchisimas gracias por todo. Un saludo. Roberto
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

calculo de 2 puntos en SQL

Publicado por leonardo_josue (877 intervenciones) el 06/11/2013 16:03:57
Hola Robertouf:

Mucho ojo... hasta donde recuerdo de mis clases de Geometría Analítica, la fórmula para calcular la distancia entre dos puntos es:

1
Raiz Cuadrada[(x2-x1)^2+(y2-y1)^2]


Notas la diferencia??? las restas entre (x2-x1) y (y2-y1) SE ELEVAN AL CUADRADO, que no es lo mismo que MULTIPLICAR POR DOS...

en otras palabras

1
(x2-x1)*(x2-x1) NO ES LO MISMO QUE (x2-x1) * 2

otro detalle que veo en tu código, estás haciendo uso de la función SUBSTR, lo que me da a entender que tus datos los tienes como CADENA, esto es una barbaridad, si estuvieras hablando de diseño de BD podrías ser reprobado, y si lo haces en una empresa, podrías ser despedido...

Todos los campos que almacenan NUMEROS, deben ser declarados como tales (lo mismo pasa con las fechas, ya que muchos tienen la terrible costumbre de almacenarlos en campos tipo texto). Si puedes cambiar tu modelo, hazlo, pero si esto no depende de ti entonces debes tener cuidado cuando usas cadenas con funciones matemáticas, ya que si no haces las conversiones a números, suelen arrojar resultados extraños.

Te recomiendo que vayas probando cada parte a la vez, para asegurarte que las operaciones se están ejecutando correctamente.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calculo de 2 puntos en SQL

Publicado por Robertouf (2 intervenciones) el 06/11/2013 16:29:47
Hola Leo, muchisimas gracias por tu respuesta rapida: efectivamente tienes toda la razon y menos mal que me he dado cuenta antes, pero el ^2 no es admitido como tal en el TOAD al menos, asi que lo he multiplicado por si mismo.

Ha quedado asi:

SQRT(abs((substr(m.x,1,6))-(substr(t.x,1,6))) * abs((substr(m.x,1,6))-(substr(t.x,1,6))) + abs((substr(m.y,1,7))-(substr(t.y,1,7))) * abs((substr(m.y,1,7))-(substr(t.y,1,7)))) AS distancia

No hay problema respecto al tipo de datos han sido convertidos antes y uso una SDO_UTIL.

GRacias de nuevo. Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calculo de 2 puntos en SQL

Publicado por leonardo_josue (877 intervenciones) el 06/11/2013 17:35:58
Hola de nuevo Robertouf:

Me da gusto que hayas resuelto tu consulta, sin embargo aun tengo algunas observaciones para tu expresión:

1. Estás haciendo uso innecesario de paréntesis... estos sólo deben colocarse cuando tengas necesidad de cambiar el orden en que ejecutas tus operaciones:

1
(substr(m.x,1,6))-(substr(t.x,1,6))

es exactamente lo mismo que

1
substr(m.x,1,6)-substr(t.x,1,6)


es decir, no hay necesidad de que pongas los paréntesis externos.

2. El uso de la función ABS es completamente inútil, si el resultado de la resta fuera un negativo, de cualquier manera, al multiplicarla por si mismo se vuelve positivo. Recuerda, CUALQUIER NÚMERO ELEVADO AL CUADRADO SIEMPRE ES POSITIVO. es por eso que en la fórmula original nunca aparece que debas colocar el valor absoluto...

3. Revisa bien las funciones que soporta tu motor de Base de Datos... así como tienes una función para extraer la raiz cuadrada, puedes tener alguna otra para elevar un número a una potencia... si tu DBMS no soporta ^2, puedes probar otras opciones, Oracle por ejemplo tiene la función POWER, de tal manera que podrías hacer esto:

1
POWER(substr(m.x,1,6)-substr(t.x,1,6), 2)


otros manejadores trabajan con el doble asterisco:

1
(substr(m.x,1,6)-substr(t.x,1,6)) ** 2

en fin, trata de simplificar tu consulta lo más posible para que tengas un mejor rendimiento.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar