Single time series
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
@Denis already provided some links.
Multiple time series
... identified by a timeseries_id
(answer to comment):
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;