2014-10-01 2 views
0

у меня есть эта таблица в Oracle:процесс Oracle SQL запросов между временем состояний

Process| State | Date ; 
A| 0 | 19/09/14 ; 
A| 1 | 30/09/14 ; 
A| 2 | 31/09/14 

С колонке даты вы знаете, когда процесс изменился в соответствующее состояние

мне нужно получить таблицу, как это

Process | Time between state 0 and 1 | time between state 1 and 2 

ответ

0

Это даст вам PROCESS, CHANGE IN STATE и NUMBER OF DAYS:

SQL> WITH DATA AS(
    2 SELECT 'A' PROCESS, 0 STATE, TO_DATE('19/09/14','dd/mm/rr') DT FROM DUAL UNION ALL 
    3 SELECT 'A',   1,  TO_DATE('30/09/14','dd/mm/rr') FROM DUAL UNION ALL 
    4 SELECT 'A',   2,  TO_DATE('01/10/14','dd/mm/rr') FROM DUAL) 
    5 SELECT PROCESS, 
    6 state 
    7 ||' - ' 
    8 ||new_state change_in_state, 
    9 NEW_DT-dt NUMBER_OF_DAYS 
10 FROM 
11 (SELECT A.*, 
12  LEAD(STATE) OVER(ORDER BY STATE, DT) NEW_STATe, 
13  LEAD(DT) OVER(ORDER BY STATE, DT) NEW_DT 
14 FROM DATA A 
15 ) 
16 WHERE NEW_DT-dt IS NOT NULL 
17/

PROCESS CHANGE_IN_ NUMBER_OF_DAYS 
---------- ---------- -------------- 
A   0 - 1    11 
A   1 - 2    1 
0

Предполагая, что процесс должен пройти через состояние 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 как имена

+0

Благодарим вас за ответ. Я получаю time_0_1 с 0 vlaue, а остальное - null. Я не знаю, почему – Madmartigan

+0

- это ваши фактические данные, например, небольшой образец? каковы имена реальных полей и имя таблицы? Чем больше усилий вы вкладываете в образец, тем лучше результат. Вы также можете настроить свой собственный http://sqlfiddle.com и предоставить нам URL-адрес –

+0

Я получил его, U_B_A. Большое спасибо! – Madmartigan

Смежные вопросы