如果anchor_id和id可以存储在元组数组中,那也很好。
多维数组的聚集函数
我想您为此创建了一个 二维数组 。这比起来更容易处理
ARRAY ofrecord。Standard
array_agg()无法聚合多维数组。但是您可以为此轻松地编写自己的聚合函数:
CREATE AGGREGATE array_agg_mult (anyarray) ( SFUNC = array_cat ,STYPE = anyarray ,INITCOND = '{}');对于出现多次的数组中的每个anchor_id:保留一个随机数,然后删除所有其他。这还意味着从每个已删除的anchor_id的ID数组中删除相应的ID
询问
SELECt DISTINCT ON (p) p, groundtruth, array_agg_mult(ARRAY[ARRAY[anchor_id, id]]) AS idsFROM ( SELECt DISTINCT ON (ps.p, m.groundtruth, m.anchor_id) ps.p, m.groundtruth, m.anchor_id, m.id FROM (SELECT unnest(point_array) AS p) AS ps JOIN measurement m ON ST_DWithin(ps.p, m.groundtruth, distance) ORDER BY ps.p, m.groundtruth, m.anchor_id, random() ) xGROUP BY p, groundtruthORDER BY p, random();
子查询每个
x
都不同,如果有多个同级,则选择一个随机行。这样,连接保持完整。anchor_id``(p, groundtruth)``anchor_id - id
外部查询聚合您想要的二维数组,按排序
anchor_id
。如果要anchor_id
随机订购,请再次使用随机:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
最后,每个人
DISTINCT ON
只能随机选择1groundtruth
个p
。



