技術系はこっちに移動中・・・。
https://qiita.com/remi_ts/items/1581132c60e60628289d

結論から書くと lag() OVER ()を使用する事で解決可能

例えばこんなテーブルがあったとする。
SELECT
id,
status
FROM ( SELECT 1, 1 UNION ALL SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 4, 0 UNION ALL
SELECT 5, 0 UNION ALL
SELECT 6, 0 UNION ALL
SELECT 7, 0
) A( id, status );
まず、上記の実行結果はこんな感じになる。
1

んで、本題

リファレンス内容
 LAG( 対象のカラム, [ 行数(省略時は1), デフォルト値(省略時はnull) ] )
メモ
 対象のカラムから行数で指定した分前のレコードを取得する。
 デフォルト値は参照レコードが存在しない(1行目とか)場合、何を表示するかを指定する。  指定先にカラム名を記述する事も可能でこの場合、自身の行の値が出力される。
 OVER( [ PARTITION BY 項目1[,項目2 , ... 項目n ] ] )
 OVER( [ ORDER BY 項目1[,項目2 , ... 項目n ] ] )
メモ
 分析関数(今回はLAG)と一緒に使用する。
 PARTITION BY 句の場合、グループ化対象項目を指定する。
 ORDER BY 句の場合、ソート対象の項目を指定する。
参考: http://lets.postgresql.jp/documents/technical/window_functions
SELECT
id,
status,
lag( status, 1, status ) OVER ( ORDER BY id )
FROM ( SELECT 1, 1 UNION ALL SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 4, 0 UNION ALL
SELECT 5, 0 UNION ALL
SELECT 6, 0 UNION ALL
SELECT 7, 0
)A ( id, status );
実行結果は以下のようになる。
2
1行目のlagの結果は前の行が無いので、自身のstatusを表示している。
2行目以降、OVERの条件でソートした並び順の場合の1行前のデータを表示している。