From 004da32f19e3de12cad8aaf8dfdc21dac70d2c5f Mon Sep 17 00:00:00 2001 From: Andy Eschbacher Date: Thu, 22 Sep 2016 14:06:23 -0400 Subject: [PATCH] first add --- src/pg/sql/17_weighted_median.sql | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/pg/sql/17_weighted_median.sql diff --git a/src/pg/sql/17_weighted_median.sql b/src/pg/sql/17_weighted_median.sql new file mode 100644 index 0000000..3b3dce8 --- /dev/null +++ b/src/pg/sql/17_weighted_median.sql @@ -0,0 +1,33 @@ +CREATE OR REPLACE FUNCTION CDB_WeightedMedianCenter(geoms geometry[], vals numeric[]) +RETURNS geometry(Point, 4326) +AS $$ +DECLARE + i INT; + median_val numeric; + median_index INT; +BEGIN + + -- find the median value + SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY v) INTO median_val + FROM unnest(vals) As x(v); + + -- find the index of the median value + FOR i in 1..array_length(vals, 1) + LOOP + IF vals[i] < median_val + THEN + median_index := i; + EXIT; + END IF; + END LOOP; + + -- return the geometry that has the median value of the dataset + IF ST_GeometryType(geoms[median_index]) <> 'ST_Point' + THEN + RETURN ST_Centroid(geoms[median_index]); + ELSE + RETURN geoms[median_index]; + END IF; + +END; +$$ LANGUAGE plpgsql;