2016-04-13 48 views
0

我有一個計算實現結果所需時間的程序。因此,例如,案件具有代碼'CB'的情況下,過程應該查看錶EVENTS以找到下一次應用一組結果代碼中的一個並使用DATE_CREATED值爲CB_DATE設置值。此案可能擁有多個代碼,但我只在CB代碼後的第一次使用興趣:例表如下:如何選擇下一個最高ID?

ID CASE_ID DATE_CREATED DATE_MODIFIED OUTCOME_CODE CB_DATE  
1  01  01/04/1970  01/04/1970  CASE_START 
2  01  01/04/1970  02/04/1970  CB 
3  01  01/04/1970  03/04/1970  PPLF 
4  02  01/04/1970  02/04/1970  TEST 
4  01  01/04/1970  04/04/1970  SACM 
5  01  01/04/1970  05/04/1970  TEST   05/04/1970 
6  01  01/04/1970  06/04/1970  OUTC    

所以我想返回DATE_MODIFIED爲「CB」後的下一個條目,其中的代碼('OUTC','TEST'),它在上面的例子中是'TEST'的第二個實例,因爲第一個實例適用於不同的CASE_ID。

目前它正在將程序應用到結果代碼集合的每個實例,如上面的示例中,TEST和OUTC的兩個實例都獲得CB_DATE值,但我只希望TEST具有CASE_ID與CASE_ID匹配的值'CB'結果。

當前的代碼是: 更新事件Ë 集CB_DATE = DATE_MODIFIED 其中OUTCOME_CODE在( '測試', 'OUTC' ....)

我原以爲我可以用

update EVENTS e 
    set  CB_DATE=DATE_MODIFIED 
    WHERE OUTCOME_CODE in ('TEST','OUTC'....) 
    AND  ID > (
    select ID 
    from EVENTS x 
    where x.OUTCOME_CODE = 'CB' 
    and x.CASE_ID=e.CASE_ID); 
+0

...和id>(從事件x中選擇max(id)..) – Mottor

+0

它並不總是最大值(id)但是,可以使用多個代碼我想要下一個最高的ID,例如ID 7在上表中可能也有CASE_ID 01的TEST結果代碼。我需要確保它選擇代碼的第一個實例。 – HardLeeWorking

+0

...和id>(從事件x中選擇max(id),其中x.id Mottor

回答

0

我一直在想這一切都是錯誤的。我需要查找MIN(ID)大於當前ID的位置,而不是MAX(ID)。

本質上我試圖獲得下一個最高的ID,這將是符合其他條件的MIN(ID),即>現有ID,其中CASE_ID匹配以及OUTCOME_CODE在相關組中的位置。

update EVENTS e 
    set  CB_DATE=DATE_MODIFIED 
    WHERE OUTCOME_CODE in ('TEST','OUTC'....) 
    AND  MIN(ID) > (
     select ID 
     from EVENTS x 
     where x.OUTCOME_CODE = 'CB' 
     and x.CASE_ID=e.CASE_ID); 
1

這可能不是最優的,但是:

UPDATE tt e 
    SET CB_DATE = DATE_MODIFIED 
WHERE OUTCOME_CODE IN ('TEST', 'OUTC') 
    AND id > (SELECT MAX (id) 
       FROM tt x 
       WHERE x.id < e.id AND x.outcome_code = 'CB' AND x.case_id = e.case_id) 
    AND NOT EXISTS 
      (SELECT 1 
      FROM tt y 
      WHERE y.id < e.id 
       AND y.OUTCOME_CODE IN ('TEST', 'OUTC') 
       AND y.case_id = e.case_id 
       AND y.id > (SELECT MAX (id) 
          FROM tt x 
          WHERE x.id < e.id AND x.outcome_code = 'CB' AND x.case_id = e.case_id)) 

另一種方式是獲得CB範圍:

SELECT id, LEAD (id, 1, 99999999999999) OVER (PARTITION BY case_id ORDER BY id) next_id, case_id 
    FROM tt 
WHERE outcome_code = 'CB' 

並獲得與最小ID的記錄代碼是('TEST','OUTC')

UPDATE tt e 
    SET CB_DATE = DATE_MODIFIED 
WHERE OUTCOME_CODE IN ('TEST', 'OUTC') 
    AND (id, case_id) IN 
     (SELECT (SELECT MIN (id) 
       FROM tt 
       WHERE OUTCOME_CODE IN ('TEST', 'OUTC') AND id BETWEEN cbs.id AND cbs.next_id AND case_id = cbs.case_id) test_id, 
      cbs.case_id 
     FROM (SELECT id, LEAD (id, 1, 99999999999999) OVER (PARTITION BY case_id ORDER BY id) next_id, case_id 
       FROM tt 
       WHERE outcome_code = 'CB') cbs) 

用事件改變tt。