【发布时间】:2016-03-16 16:07:37
【问题描述】:
PostgreSQL 中是否可以对数组元素进行分组?
例如,我有 2 个这样的相关数组(我说相关是因为第一个数组表示动作,第二个数组表示这些动作的时间:
col0 = 'any_value'
col1 = array1['a','b','b','c','c','a','a','a','c']
col2 = array2[1,2,3,4,5,6,7,8,9]
我想输出以下结果:
col0 = 'any_value'
array_result1['a','b','c','a','c']
array_result2[1,2,4,6,9]
数组可以取消嵌套的一种方法是使用序数,这是一个示例查询,但它返回的数组元素的不同选择会删除重复的元素:
select col0,
array_agg(x order by rn) as unique_array1
from (
select
distinct on (col0, a.x) col0,
a.x,
a.rn
from table_a,
unnest(array1) with ordinality as a (x,rn)
order by 1,2,3
) unnested_ordered
group by col0;
所以结果是:
col0 = 'any_value'
array_result1['a','b','c']
但正如您所见,它缺少许多元素。
编辑:
为了更多地描述我的问题,最后我想知道每个 array_result1 操作最初是什么时候完成的。 所以对于示例结果
array_result1['a','b','c','a','c']
*array_result2[1,2,4,6,9]
*我假设数组的位置从1而不是0开始,我也固定了最后一个元素,应该是9而不是7
将帮助我知道第一个动作“a”什么时候发生,第二个动作“a”什么时候发生,这样我就可以计算出动作“a”返回到我正在构建的路径的时间。 所以第一次发生的动作'a'是= 1 第二次发生是 = 6
所以动作'a'在路径(数组)中出现了两次,需要5个时间单位才能重新出现。这就是为什么我需要第二个数组,其中包含动作发生的时间(每个动作第一次发生的时间)
【问题讨论】:
-
我不明白你的第二个结果。不应该是
1,2,4,6,9吗? -
不,字母的位置很重要,就像按字母的子组分组
标签: sql arrays postgresql gaps-and-islands