sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL til at iterere gennem rækker og finde det nærmeste match ved hjælp af tilpasset afstandsfunktion

Generelt kan du løse denne type problemer ved at bruge en lagret funktion, skrevet i Java eller Scala (nogle foretrækker måske PL/SQL, C eller C++).

PostgreSql understøtter (Java-baserede) lagrede funktioner, så lad SQL-forespørgslen hente dataene og videregive dem til en lagret funktion. Den gemte funktion returnerer afstanden, så du kan filtrere/sortere osv. på den.

Baseret på en tabel som denne

create table point(vector float8[]);insert into point values('{0.0, 0.0, 0.0}');insert into point values('{0.5, 0.5, 0.5}'); 

med en Java-funktion som denne:

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)); }} 

og funktionserklæringen i SQL:

OPRET FUNKTION pljava.distance2(float8[], float8[]) RETURNERER float8 SOM 'PlJava.distance2' UDVIKLET SPROG java; 

din forespørgsel kunne se sådan ud:

vælg punkt.*, pljava.distance2(vector, '{1.0, 1.0, 1.0}') som dist fra punktrækkefølge efter dist;  

hvilket resulterer i

vektor | dist ---------------+------------------------ {0.5,0.5,0.5} | 0,866025403784439 {0,0,0} | 1,73205080756888

Opdater

Lagrede funktioner kan også skrives i C og C++. C++ kræver mere indsats, fordi grænsefladen til PostgreSql bruger C-kaldekonventionen. Se Brug af C++ til udvidelsesmuligheder



  1. Kopier flere poster med en master-detaljer relation

  2. Indsæt hele værdien af ​​DataTable-bulk i postgreSQL-tabellen

  3. At køre en .sql-fil i MySQL

  4. Rails ActiveRecord sorterer efter antal tilknyttede bordforeninger