PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL para iterar pelas linhas e encontrar a correspondência mais próxima usando a função de distância personalizada


De um modo geral, você pode resolver esse tipo de problema usando uma função armazenada, escrita em Java ou Scala (alguns podem preferir PL/SQL, C ou C++).

PostgreSql suporta funções armazenadas (baseadas em Java), então deixe a consulta SQL buscar os dados e passá-los para uma função armazenada. A função armazenada retorna a distância, para que você possa filtrar/classificar etc. nela.

Com base em uma tabela como esta
criar ponto de tabela(vetor float8[]);inserir em valores de ponto('{0.0, 0.0, 0.0}');inserir em valores de ponto('{0.5, 0.5, 0.5}'); 

com uma função Java como esta:
public class PlJava { public final static double distance2(double[] v1, double[] v2) { return Math.sqrt(Math.pow(v2[0] - v1[0], 2) + Math .pow(v2[1] - v1[1], 2) + Math.pow(v2[2] - v1[2], 2)); }} 

e a declaração da função em SQL:
CRIAR FUNÇÃO pljava.distance2(float8[], float8[]) RETORNA float8 AS 'PlJava.distance2' IDIOMA IMUTÁVEL java; 

sua consulta pode ficar assim:
select point.*, pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist da ordem dos pontos por dist;  

o que resulta em
vetor | dist ---------------+------------------- {0.5,0.5,0.5} | 0,866025403784439 {0,0,0} | 1.73205080756888

Atualizar

As funções armazenadas também podem ser escritas em C e C++. C++ requer mais esforço, porque a interface para PostgreSql está usando a convenção de chamada C. Consulte Usando C++ para extensibilidade