前提・実現したいこと
Timestampと3種類の信号の状態が0/1で格納されたテーブルtbl_dummyがあります。
ts col_a col_b col_c
2020/12/23 14:12 0 1 0
2020/12/23 14:13 0 0 1
2020/12/23 14:14 0 1 0
2020/12/23 14:15 0 1 0
2020/12/23 14:16 0 0 1
2020/12/23 14:17 0 0 1
2020/12/23 14:18 0 0 1
2020/12/23 14:19 0 0 1
2020/12/23 14:20 0 0 1
2020/12/23 14:21 1 0 1
2020/12/23 14:22 1 1 1
2020/12/23 14:23 1 1 0
2020/12/23 14:24 0 0 1
2020/12/23 14:25 0 0 1
2020/12/23 14:26 1 0 0
得たい結果は各信号がON(1)の区間の開始時刻(start_tm)、終了時刻(end_tm)、信号名(A/B/C)です。
start_tm end_tm on_signal
null 2020/12/23 14:13 B
2020/12/23 14:13 2020/12/23 14:14 C
2020/12/23 14:14 2020/12/23 14:16 B
2020/12/23 14:16 2020/12/23 14:23 C
2020/12/23 14:21 2020/12/23 14:24 A
2020/12/23 14:22 2020/12/23 14:23 B
2020/12/23 14:24 2020/12/23 14:26 C
2020/12/23 14:26 null A
以下のSQLを作成しましたが、望む結果が得られません。
どのようにすればよいか、アドバイスお願いします。
該当のソースコード
SQL
1SELECT 2 CASE WHEN col_a_dif = 1 THEN ts 3 WHEN col_b_dif = 1 THEN ts 4 WHEN col_c_dif = 1 THEN ts 5 END AS start_tm, 6 CASE WHEN col_a_dif = -1 THEN ts 7 WHEN col_b_dif = 1 THEN ts 8 WHEN col_c_dif = 1 THEN ts 9 END AS end_tm, 10 CASE WHEN col_a_dif = -1 THEN 'A' 11 WHEN col_b_dif = 1 THEN 'B' 12 WHEN col_c_dif = 1 THEN 'C' 13 END AS on_signal 14FROM( 15SELECT ts, 16 col_a - lag(col_a, 1) over(ORDER BY ts) as col_a_dif, 17 col_b - lag(col_b, 1) over(ORDER BY ts) as col_b_dif, 18 col_c - lag(col_c, 1) over(ORDER BY ts) as col_c_dif 19FROM tbl_dummy) as tbl_dif 20WHERE (col_a_dif | col_b_dif | col_c_dif) <> 0 21;
上記SQLの結果
補足情報(FW/ツールのバージョンなど)
PostgreSQL バージョン10
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/26 23:29