PostgreSQL(9.1)で整数配列の列を分析したいと思います。intarray
(ここのドキュメント)を使用して、私は計算することができます:
- 配列の長さ
- 最小値
- 最大値
- 固有の要素の数
私の質問は:
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 [I]-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
これを行う簡単な方法はありますか?150000000行のテーブルでこれを計算する必要があります。
サンプルデータ(または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]);