use*_*062 5 sql database postgresql time-series window-functions
假设我有一个简单的表格:
<timestamp> <state (A or B)>
Run Code Online (Sandbox Code Playgroud)
我希望能够选择系列从状态 A 转换到状态 B 的所有时间(即 X t = B && X t-1 = A)。例如,使用数据:
00:00 A
00:01 A
00:02 B
00:03 B
00:04 B
00:05 B
00:06 A
00:07 B
00:08 B
Run Code Online (Sandbox Code Playgroud)
我想回来00:02并且00:07。
也许我搜索了错误的关键字,但我找不到类似问题的任何好例子。我如何使用 PostgreSQL 来解决这个问题?
SELECT ts
FROM (
SELECT *, lag(state) OVER (ORDER BY ts) AS last_state
FROM tbl
) sub
WHERE state = 'B'
AND last_state = 'A'
ORDER BY ts; -- I assume you want ordered results
Run Code Online (Sandbox Code Playgroud)
timeseries_id...由(评论的答案)标识:
SELECT timeseries_id, ts
FROM (
SELECT *, lag(state) OVER (PARTITION BY timeseries_id
ORDER BY ts) AS last_state
FROM tbl
) sub
WHERE state = 'B'
AND last_state = 'A'
ORDER BY timeseries_id, ts;Run Code Online (Sandbox Code Playgroud)