2017-03-15 11 views
0

I日付降順でソートメインクエリからこの結果を出力するテーブル(最新である上部)サブクエリ列から最新の列の値を取得し、単一の行に結果を崩壊

colA   colb  colc 
---------------------------- 
null   null  null 
True   null  null 
False  null  null 
null   True  null 
null   null  False 

私は思いを持っています

colA   colb  colc 
----------------------------- 
null   null  null 
False  null  null 
True   null  null 
null   True  null 
null   null  False 
01:最終的な結果のように、この

colA  colB colC 
----------------------- 
True  True False 

一つはbool_or集計関数を使用することができますが、それはこのような場合には動作しないように見えます

これの出力は

colA  colB colC 
---------------------- 
False  True False 

は基本的に、私は各列のすべての行を横断し、かつnullでない最も古い値を取得し、それを返すために必要になります。

これまでのところ、私は最初の値を取得するには、ウィンドウ関数を取得するには、FIRST_VALUEを使用してい

が、残念ながら、テーブル内のすべての行

select first_value(cola) over() as cola 
from my_data 
where cola is not null; 

戻り

cola 
    ----- 
    f 
    f 

私は、FIRST_VALUEをしようとした場合行の量が各列で一致しないので、他の列は返されません。

これを行う最善の方法は何ですか?

答えて

1
with t (date, cola, colb, colc) as (values 
    (current_date, null, null, null), 
    (current_date - 1, true, null, null), 
    (current_date - 2, false, null, null), 
    (current_date - 3, null, true, null), 
    (current_date - 4, null, null, false) 
) 
select 
    (array_agg(fv_cola) filter (where fv_cola is not null))[1] as cola, 
    (array_agg(fv_colb) filter (where fv_colb is not null))[1] as colb, 
    (array_agg(fv_colc) filter (where fv_colc is not null))[1] as colc 
from (
    select 
     first_value(cola) over(
      partition by cola is null 
      order by date desc 
     ) as fv_cola, 
     first_value(colb) over(
      partition by colb is null 
      order by date desc 
     ) as fv_colb, 
     first_value(colc) over(
      partition by colc is null 
      order by date desc 
     ) as fv_colc 
    from t 
) s 
; 
cola | colb | colc 
------+------+------ 
t | t | f 
関連する問題