0

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)

私は次のアプローチを使用して計算できると思います:

  1. 配列の一意の要素を取得する
  2. 配列を並べ替える
  3. 配列内の各要素について、A [I]-A [I+1]を減算します。
  4. ステップ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]);
4

2 に答える 2

1

SQLフィドル

select intarr, min(diff) min_diff
from (
    select
        intarr,
        i - lag(i) over(partition by intarr order by i) diff
    from (
        select distinct intarr, unnest(intarr) i
        from tmp
    ) s
) s
group by intarr
于 2013-02-28T15:43:09.147 に答える
1

配列を反復処理する関数:

create or replace function array_min_diff(a int[])
returns int as
$$
declare
    min_diff int = null;
    i int = 2;
begin
    select array_agg(e order by e)
    from (
        select distinct e
        from unnest(a) s(e)
    ) s
    into a;

    loop
        min_diff = least(min_diff, a[i] - a[i - 1]);
        i := i + 1;
        exit when i > array_upper(a, 1);
    end loop;

    return min_diff;
end;
$$ language plpgsql immutable
于 2013-02-28T18:25:53.453 に答える