sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL pro iteraci řádků a nalezení nejbližší shody pomocí vlastní funkce vzdálenosti

Obecně řečeno můžete tento typ problémů vyřešit pomocí uložené funkce napsané v Javě nebo Scale (někteří mohou preferovat PL/SQL, C nebo C++).

PostgreSql podporuje (na bázi Java) uložené funkce, takže nechejte SQL dotaz načíst data a předat je uložené funkci. Uložená funkce vrací vzdálenost, takže ji můžete filtrovat/třídit atd.

Na základě tabulky, jako je tato

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

s funkcí Java, jako je tato:

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

a deklaraci funkce v SQL:

CREATE FUNCTION pljava.distance2(float8[], float8[])
  RETURNS float8
  AS 'PlJava.distance2'
  IMMUTABLE
  LANGUAGE java;

váš dotaz může vypadat takto:

select
    point.*, 
    pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
  from
    point 
  order by
    dist;    

což má za následek

    vector     |       dist  
---------------+-------------------  
 {0.5,0.5,0.5} | 0.866025403784439  
 {0,0,0}       |  1.73205080756888  

Aktualizovat

Uložené funkce lze psát také v C a C++. C++ vyžaduje více úsilí, protože rozhraní PostgreSql používá konvenci volání C. Viz Použití C++ pro rozšiřitelnost



  1. Jak vytvořit funkci SQL Server pro spojení více řádků z poddotazu do jednoho odděleného pole?

  2. Jak porovnám překrývající se hodnoty v rámci řádku?

  3. Jak přidat číslo řádku do skupiny v mém dotazu

  4. xampp MySQL se nespustí