2014-10-01 50 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

這會給你的PROCESSCHANGE IN STATENUMBER 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

謝謝您的回答。我用0 vlaue獲得time_0_1,其餘爲空。我不知道爲什麼 – Madmartigan 2014-10-01 09:39:05

+0

是你的小樣本的實際數據?什麼是真正的字段名稱和表名稱?您投入樣本的努力越多,結果就越好。您也可以設置您自己的http://sqlfiddle.com並提供給我們URL – 2014-10-01 10:05:08

+0

我明白了,U_B_A。非常感謝! – Madmartigan 2014-10-01 11:35:08