我想分析PostgreSQL中的整數數組列(9.1)。使用intarray
(docs here)我能夠計算:獲取整數數組中不等元素的最小差異
- 陣列長度
- 最小值
- 最大值
- 數目的獨特元素 的
我的查詢:
select
(array_length(string_to_array(num_partition,' ')::int[], 1))::smallint as part_len,
icount(uniq(sort(string_to_array(num_partition,' ')::int[])))::smallint as part_unq,
((sort(string_to_array(num_partition,' ')::int[],'desc'))[1])::smallint as part_max,
((sort(string_to_array(num_partition,' ')::int[]))[1])::smallint as part_min
from
tmp.npart
現在我想計算任何不相等的元素之間的最小差異。例如:
Array [1,5,5,10]
Expected result: 4 (because of 5-1 equals to 4)
我想可以使用以下的方法計算:
- 獲取陣列的獨特元素
- 排序陣列
- 對於每個元件在陣列。減去A [1] - A [I + 1]
- 獲得步驟3中的最大結果
例如:
Input: [7,9,12,20,25,1,1,20,25]
1) Unique [1,7,9,12,20,25]
2) Sort (desc): [25,20,12,9,7,1]
3) Diff A[i] - A[i+1]: [5,8,3,2,6]
4) Min: 2
有沒有簡單的方法如何做到這一點?我需要在一張有150 000 000行的桌子上計算這個值。
樣品數據(或sqlfiddle):
create table tmp (intarr int[]);
insert into tmp values (ARRAY[1,1,3,6,9,25]);
insert into tmp values (ARRAY[10,20,30,50]);
insert into tmp values (ARRAY[1,4,8,15,21]);
insert into tmp values (ARRAY[1]);
insert into tmp values (ARRAY[1,1,1,1,9,9,9,9,20,20,20]);
這可能是值得研究它是否是更有效的使用拒絕零差異的方法,而不是添加唯一的方法對陣列進行操作。 – 2013-03-01 11:59:14