PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL untuk beralih melalui baris dan menemukan kecocokan terdekat menggunakan fungsi jarak khusus

Secara umum Anda dapat memecahkan masalah jenis ini dengan menggunakan fungsi tersimpan, yang ditulis dalam Java atau Scala (beberapa mungkin lebih suka PL/SQL, C atau C++).

PostgreSql mendukung fungsi tersimpan (berbasis Java), jadi biarkan kueri SQL mengambil data, dan meneruskannya ke fungsi tersimpan. Fungsi yang disimpan mengembalikan jarak, sehingga Anda dapat memfilter/mengurutkan dll. di atasnya.

Berdasarkan tabel seperti ini

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

dengan fungsi Java seperti ini:

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

dan deklarasi fungsi dalam SQL:

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

kueri Anda dapat terlihat seperti ini:

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

yang menghasilkan

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

Perbarui

Fungsi yang disimpan dapat ditulis dalam C dan C++ juga. C++ membutuhkan lebih banyak usaha, karena antarmuka ke PostgreSql menggunakan konvensi pemanggilan C. Lihat Menggunakan C++ untuk Ekstensibilitas



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails 4 / postgresql - menyisipkan data pada tabel berdasarkan data tabel lain (after_create)

  2. Permintaan SQL PostgreSQL untuk melintasi seluruh grafik yang tidak diarahkan dan mengembalikan semua tepi yang ditemukan

  3. Tampilan Drop Postgresql

  4. Hasilkan string acak unik di plpgsql

  5. Django get_or_create gagal menyetel bidang saat digunakan dengan iexact