Предполагая, что процесс должен пройти через состояние 0, будет иметь 1 в качестве следующего состояния и 2 в качестве следующего состояния; Этот запрос использует LEAD() смотреть вперед 1 и 2 значения состояния (если они существуют)
Запрос
SELECT
PROCESS
, l1STATEDATE - STATEDATE AS TIME_0_1
, l2STATEDATE - L1STATEDATE AS TIME_1_2
FROM (
SELECT
PROCESS
, STATE
, STATEDATE
--, lead(STATE,1) over(partition by PROCESS ORDER BY STATEDATE) as l1STATE
, lead(STATEDATE,1) over(partition by PROCESS ORDER BY STATEDATE) as l1STATEDATE
--, lead(STATE,2) over(partition by PROCESS ORDER BY STATEDATE) as l2STATE
, lead(STATEDATE,2) over(partition by PROCESS ORDER BY STATEDATE) as l2STATEDATE
FROM STATEINFO
)
WHERE STATE = 0
Результат:
| PROCESS | TIME_0_1 | TIME_1_2 |
|---------|----------|----------|
| A | 11 | 1 |
See the SQLFiddle demo
Примечание. Я использовал имя поля «stateDate», поскольку я не рекомендую использовать ключевые слова SQL как имена
Благодарим вас за ответ. Я получаю time_0_1 с 0 vlaue, а остальное - null. Я не знаю, почему – Madmartigan
- это ваши фактические данные, например, небольшой образец? каковы имена реальных полей и имя таблицы? Чем больше усилий вы вкладываете в образец, тем лучше результат. Вы также можете настроить свой собственный http://sqlfiddle.com и предоставить нам URL-адрес –
Я получил его, U_B_A. Большое спасибо! – Madmartigan