2016-06-30 52 views
0

我嘗試了許多oracle分析函數來實現我的需求,但無法實現。 這裏是一個簡單的例子:甲骨文獲得超過訂單組的第一價值

WITH W1 AS (
SELECT 100 key1, 0 key2, 0 key3, 'open' status, 'date1' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 1 key3, 'open' status, 'date2' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 2 key3, 'close' status, 'date3' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 3 key3, 'close' status, 'date4' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 4 key3, 'close' status, 'date5' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 5 key3, 'open' status, 'date6' date_column FROM DUAL UNION ALL 
SELECT 100 key1, 0 key2, 6 key3, 'open' status, 'date7' date_column FROM DUAL) 
SELECT W1.*, 
     CASE WHEN LAG(status,1) OVER(PARTITION BY key1,key2 ORDER BY key3) <> status THEN date_column 
      ELSE FIRST_VALUE(date_column) OVER (PARTITION BY key1,key2,status ORDER BY key3 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) END as DESIRED 
    FROM W1 
ORDER BY 1,2,3 

我想,當狀態改變克服組有序第一個值。 我只需要在DESIRED列上的最後一行應該是「date6」

你有什麼建議嗎? Oracle 11gr2

謝謝。

+0

你能告訴你想要的輸出? –

+0

只有查詢結果的最後一行需要是「date6」 – Deniz

回答

0

從Oracle 12C R1(12.1)開始,有一排限制性條款

可以使用FETCH FIRST 1 ROWS ONLY;

WITH W1 AS (
    SELECT 100 key1, 0 key2, 0 key3, 'open' status, 'date1' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 1 key3, 'open' status, 'date2' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 2 key3, 'close' status, 'date3' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 3 key3, 'close' status, 'date4' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 4 key3, 'close' status, 'date5' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 5 key3, 'open' status, 'date6' date_column FROM DUAL UNION ALL 
    SELECT 100 key1, 0 key2, 6 key3, 'open' status, 'date7' date_column FROM DUAL) 
    SELECT W1.*, 
      CASE WHEN LAG(status,1) OVER(PARTITION BY key1,key2 ORDER BY key3) <> status THEN date_column 
       ELSE FIRST_VALUE(date_column) OVER (PARTITION BY key1,key2,status ORDER BY key3 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) END as DESIRED 
     FROM W1 
    ORDER BY 1,2,3 
    FETCH FIRST 1 ROWS ONLY; 

看到的文檔https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1

+0

這不起作用 – Deniz

+0

我發現這個https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n -queries-12cr1 ...你有錯誤嗎? – scaisEdge