2017-02-23 7 views
0

PostgreSQL ARRAYの項目のうち、どの項目が初期配列の項目から派生した新しい配列を作成するには?別の配列から派生した項目を持つ新しい配列を作る

例:私はINTERVALの値の配列を持っています。私は各項目が対応するINTERVAL値の合計秒数であるNUMERIC(10, 1)である新しい配列が欲しいです。

私は1つのINTERVAL値に変換する方法を知っている:配列がテーブルに存在しない

foo=> SELECT '00:01:20.000'::INTERVAL AS duration_interval; 
duration_interval 
------------------- 
00:01:20 
(1 row) 

foo=> SELECT extract(EPOCH FROM date_trunc('second', '00:01:20.000'::INTERVAL)) 
    ::NUMERIC(10, 1) AS duration_seconds; 
duration_seconds 
------------------ 
      80.0 
(1 row) 

を - これは、別の関数呼び出しから返された値である - ので、変換コードは、としてそれを操作する必要がありますアレイ。

の値をINTERVALの値に対応する配列NUMERICに変換するにはどうすればよいですか?

答えて

1

配列をunnest()にする必要があります。変換を行い、次に配列に集約します。

SELECT array_agg(extract(epoch from dur_int)::numeric(10,1) 
       ORDER BY ordinality) AS duration_seconds 
FROM unnest(function(...)) WITH ORDINALITY d(dur_int); 

注:あなたは、このような関数呼び出しの結果として単一の配列を、持っている場合

SELECT pk, array_agg(extract(epoch from dur_int)::numeric(10,1) 
        ORDER BY ordinality) AS duration_seconds 
FROM my_table, unnest(duration_interval) WITH ORDINALITY d(dur_int) 
GROUP BY pk; 

:あなたは主キーで、実際のテーブルの上にこれをしたいと仮定すると、

配列をネストしないときはWITH ORDINALITY clauseが必要です。これにより、すべての行に2つの列、つまり(dur_int interval, ordinality bigint)があるように、列にordinalityが追加されます。間隔の代わりに秒を指定したputting the array back againの場合は、ordinality列で行を並べ替えます。そのようにして、結果として得られる秒数の配列内の順序が元の配列の配列と同じになるようにします。 (一般的に、SQLの行ソースには特定の順序がありません。サーバーは好きな順序で行を表示することがあります)。

この関数にアクセスでき、他の用途を壊さない場合は、その結果を直接使用できるように関数を変更します。

+0

ありがとうございます。いいえ、これはテーブルの上にありません。別の関数から返された配列に対して実行したい操作です。 – bignose

+0

私は、関数呼び出しの結果に対してそれを行う方法を示して答えを広げました。 – Patrick

0

プライマリキーがある場合@Patrick答えがあれば十分です。そうでない場合は、row_numberを使用して集約してください:

with i(i) as (values 
    (array['00:01:20.000','00:00:30.000']::interval[]), 
    (array['00:02:10.000','00:01:30.000']::interval[]) 
) 
select array_agg(extract(epoch from a)::numeric(10,1)) 
from (
    select i, row_number() over() as r 
    from i 
) s, unnest(i) a (a) 
group by r 
; 
    array_agg 
-------------- 
{80.0,30.0} 
{130.0,90.0} 
+0

ありがとうございます。一文字の名前(「i」、「s」など)ではなく、それらの用語に名前を付けて、その意味を明確にすることができますか? – bignose

+0

'unnest()WITH ORDINALITY'を使用して、配列の順序が維持されるようにします。 – Patrick

関連する問題