製造業でデータ分析 | PostgreSQL | LAG、LEADを活用してレコードを1行ずらす
- 2022.08.17
- データベース

みなさん、こんにちは!
今回は前回同様で時系列データを扱うためのクエリを紹介します。
目次
イメージ
データベース上に下図のように、「1:作業開始時」と「0:停止時」の「時刻」が交互に記録されている状況を考えます。

これを下図のように変換したいと思います。

要は「レコード1行の中に”開始時刻”と”終了時刻”を持たせる」ように変換を掛けます。
LAGの活用
上記の変換で役に立つのが「LAG」です。
LAGの役割
LAG関数を用いることで、N行ずらす(前 or 後)ことができます。
引数は下記の①~④です。
LAG( ①ずらす対象の列, ②何行ずらすか?, ③ずれた際に発生する空欄の処理 ) OVER( ORDER BY ④並び替え対象の列)
LAGに「ずらす対象」、OVER句に「並び替え対象の列」
例1:1行後ろにずらす場合
SELECT
update_time as 開始時間
,lag( update_time,1 ) OVER( ORDER BY update_time ) as 終了時間
FROM product_results

例2:1行前にずらす場合
SELECT
update_time as 開始時間
,lag( update_time,-1 ) OVER( ORDER BY update_time ) as 終了時間
FROM product_results

補足:LEAD句
SELECT
update_time as 開始時間
,lead( update_time,1 ) OVER( ORDER BY update_time ) as 終了時間
,lead( update_time,1 ) OVER( ORDER BY update_time ) -update_time as 作業時間
FROM product_results
LAG句と似た役割で「LEAD句」があります。
LEAD( update_time,1 ) と LAG( update_time,-1 )は同じ結果が得られます。
例3:NULLに別の値を入れる場合
SELECT
update_time as 開始時間
,lag( update_time,1,‘9999/9/9’ ) OVER( ORDER BY update_time ) as 終了時間
FROM product_results

クエリ
以上を踏まえたうえで作成したクエリです。
SELECT
update_time as 開始時間
,lag( update_time,-1 ) OVER( ORDER BY update_time ) as 終了時間
,lag( update_time,-1 ) OVER( ORDER BY update_time ) -update_time as 作業時間
FROM product_results
想定通りの形に変換することができました。

-
前の記事
製造業でデータ分析 | PostgreSQL | 時系列データを5分毎にデータをまとめる 2022.08.10
-
次の記事
SQL | Where 0=0の目的 2022.10.21