MinPair — It takes as input parameter an array of two double values, and returns the minimum second value of the array.
Array MinPair(Array [double A
double B]);
It takes as input parameter an array of two double values, and returns the minimum second value of the array.
This function can be used to obtain the minimum distance between a set of points, as shown in the following examples. Within PostgreSQL it is used with the spatial index to reduce the search space.
| 2D | 3D | M |
|---|---|---|
- | - | - |
| OGC SFS for SQL. 1.1 (1999) | OGC SFS for SQL. 1.1.0 (2005) | OGC SFS for SQL. 1.2.0 (2006) | SQL-MM Part 3 |
|---|---|---|---|
| - | - | - | - |
PostgreSQL
create table a(c1 double precision, c2 double precision);
insert into a values (10,2.456);
insert into a values (5,1.456);
insert into a values (20,2.256);
select minpair(Array[c1,c2]) from a;
minpair
-----------
{5,1.456}
(1 row)H2
create table a(c1 integer, c2 double); insert into a values (10,2.456); insert into a values (5,1.456); insert into a values (20,2.256); select minpair((c1::double,c2)) from a; --Result MINPAIR((CAST(C1 AS DOUBLE), C2)) (5.0, 1.456)
Suppose you have a table of points and you want to get which is the closest point to each point and the shortest distance between them.
CREATE TABLE points(gid serial PRIMARY KEY);
SELECT AddGeometryColumn ('points','geom',-1,'POINT',2);
--H2: SELECT AddGeometryColumn ('POINTS','GEOM',-1,'POINT',2);
INSERT INTO points(geom) VALUES (ST_GeomfromText('POINT (8 10)'));
...
gid | st_astext
-----+---------------
1 | POINT (8 10)
2 | POINT (18 15)
3 | POINT (11 15)
4 | POINT (13 13)
5 | POINT (11 12)
6 | POINT (0 11)
7 | POINT (15 3)
8 | POINT (28 17)
9 | POINT (19 23)
10 | POINT (27 8)
11 | POINT (7 2)
12 | POINT (20 10)
13 | POINT (7 23)
(13 rows) | ![]() |
PostgreSQL
SELECT d1.gid, MinPair(ARRAY[d2.gid,distance(d1.geom,d2.geom)]), count(*)
FROM points d1, points d2
WHERE (ST_Expand (d1.geom,10) && d2.geom) and distance (d1.geom,d2.geom) > 0
GROUP BY d1.gid;
gid | minpair | count
-----+-----------------------+-------
1 | {5,3.60555127546399} | 7
2 | {4,5.3851648071345} | 8
3 | {4,2.82842712474619} | 7
4 | {5,2.23606797749979} | 8
5 | {4,2.23606797749979} | 7
6 | {1,8.06225774829855} | 2
7 | {11,8.06225774829855} | 5
8 | {10,9.05538513813742} | 4
9 | {2,8.06225774829855} | 4
10 | {12,7.28010988928052} | 3
11 | {1,8.06225774829855} | 4
12 | {2,5.3851648071345} | 7
13 | {3,8.94427190999916} | 2
(13 rows)H2
SELECT d1.gid, MinPair((d2.gid::double,distance(d1.geom,d2.geom))) as minpair, count(*) FROM points d1, points d2 WHERE distance (d1.geom,d2.geom) > 0 GROUP BY d1.gid; GID MINPAIR COUNT(*) 1 (5.0, 3.605551275463989) 12 2 (4.0, 5.385164807134504) 12 3 (4.0, 2.8284271247461903) 12 4 (5.0, 2.23606797749979) 12 5 (4.0, 2.23606797749979) 12 6 (1.0, 8.06225774829855) 12 7 (11.0, 8.06225774829855) 12 8 (10.0, 9.055385138137417) 12 9 (2.0, 8.06225774829855) 12 10 (12.0, 7.280109889280518) 12 11 (1.0, 8.06225774829855) 12 12 (2.0, 5.385164807134504) 12 13 (3.0, 8.94427190999916) 12