訪問を記録するテーブルを考えます
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
このサンプルデータを検討してください(カウンターとして簡略化されたタイムスタンプ)
ts| person | somevalue
-------------------------
1 | bob |null
2 | bob |null
3 | jim |null
4 | bob | A
5 | bob | null
6 | bob | B
7 | jim | X
8 | jim | Y
9 | jim | null
私は、その値が変更される(つまり、次の非null値になる)まで、その人の最後の非null somevalueをすべての将来の訪問に持ち越そうとしています。
予想される結果セットは次のようになります。
ts| person | somevalue | carry-forward
-----------------------------------------------
1 | bob |null | null
2 | bob |null | null
3 | jim |null | null
4 | bob | A | A
5 | bob | null | A
6 | bob | B | B
7 | jim | X | X
8 | jim | Y | Y
9 | jim | null | Y
私の試みは次のようになります:
select *,
first_value(somevalue) over (partition by person order by (somevalue is null), ts rows between UNBOUNDED PRECEDING AND current row ) as carry_forward
from visits
order by ts
注:(somevalue is null)は、ソートの目的で1または0に評価されるため、パーティション内の最初のnull以外の値を取得できます。
上記は私が求めている結果を私に与えません。
答えに値する@a_horse_with_no_name。
—
ypercubeᵀᴹ
pg_dump
、あなたのテストデータではなく、psqlの出力にデータを貼り付けて、テーブルのスキーマのために?pg_dump -t table -d database
作成とCOPY
コマンドが必要です。