2013-02-28 59 views
0

我想分析PostgreSQL中的整數數組列(9.1)。使用intarraydocs 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) 

我想可以使用以下的方法計算:

  1. 獲取陣列的獨特元素
  2. 排序陣列
  3. 對於每個元件在陣列。減去A [1] - 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 

有沒有簡單的方法如何做到這一點?我需要在一張有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]); 
+0

這可能是值得研究它是否是更有效的使用拒絕零差異的方法,而不是添加唯一的方法對陣列進行操作。 – 2013-03-01 11:59:14

回答

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 
+0

酷,我已經改變了選擇部分'選擇uniq(排序(一))到一個;'希望intarray函數比'unnest()'稍快一點' – 2013-03-01 08:49:15

1

SQL Fiddle

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 
+0

謝謝。我希望沒有'unnest'的解決方案(因爲桌子大小),但我會測試它並讓你知道。 – 2013-02-28 15:55:39

+0

@ twn08你可以遍歷plpgsql函數中的數組。不知道它會更有效率。 – 2013-02-28 15:59:09

相關問題