使用 SELECT DISTINCT 在 PGSQL 中检索几乎相同的数组值

Using SELECT DISTINCT to retrieve nearly identical array values in PGSQL

在我目前正在开发的一个应用程序中,用户可以通过他们的 latitude/longitude 坐标识别位置。位置条目最终出现在 Postgres table.

CREATE TABLE "public"."destis" (
 "id" integer DEFAULT nextval('destis_id_seq') NOT NULL,
 "author" integer NOT NULL,
 "einzig" character varying(12) NOT NULL,
 "lang" character varying(2) NOT NULL,
 "title" character varying(24) NOT NULL,
 "xtent" real[] DEFAULT '{0,0,0,0}' NOT NULL,
 "center" real[] DEFAULT '{0,0}' NOT NULL,
 "touchdown" real[] NOT NULL,
 CONSTRAINT "destis_einzig" UNIQUE ("einzig")
) WITH (oids = false);

以上是 table 的简化版本 - 我跳过了不相关的字段条目。我想要 运行 一个周期性的 CRON 作业,该作业更新每个不同位置的天气数据(存储在 Redis 上),如 table 每行中的 center 列所标识。

这里的问题在于那个词 - DISTINCT。在典型情况下,我可能有两个或更多位于几乎相同位置的目标条目。例如

center = {5.87083,49.7784611}
center = {5.87099,49.7784703}
center = {5.87021,49.778452} 

出于所有实际目的,这里只有一对 latitude/longitude {5.871,49.778},我需要为此启动外部 API 调用以获取当前天气。

这里的问题是如何直接在 SQL 中执行此操作?虽然我可以很容易地获取所有 center 数组值作为 JSON,但将它们与 PHP 中的 接近相等 进行比较,然后仅获取一些天气不同的位置 我不禁想知道是否有一种方法可以简单地 运行 一个查询 returns 不同的 {lat,long} 值四舍五入到小数点后三位。我有时用过 SELECT DISTINCT... 但我不知道 how/whether 我可以在数组字段上使用它

您可以使用如下方式将数组转换为舍入值数组:

array[round(center[1]::numeric, 2), round(center[2]::numeric, 2)]::real[] as center

我可能会创建一个函数,这样我就不必一遍又一遍地重复这个表达式。