2017-06-26 95 views
0

我得到這個查詢滯後功能正常

CREATE OR REPLACE View QTY_VIEW As 
SELECT  
    DATA_VIEW.RAW_ID as RAW_ID, 
    DATA_VIEW.CREATE_DATE as CREATE_DATE, 
    DATA_VIEW.UPDATE_DATE as UPDATE_DATE, 
    DATA_VIEW.INITIAL_QTY as INITIAL_QTY, 
    DATA_VIEW.ACTUAL_QTY as ACTUAL_QTY, 
    DATA_VIEW.USED_QTY as USED_QTY, 
    DATA_VIEW.LAST_USED_BY as LAST_USED_BY, 
    CASE 
    WHEN DATA_VIEW.ACTUAL_QTY = DATA_VIEW.INITIAL_QTY 
     THEN 0    
    WHEN LAG(DATA_VIEW.USED_QTY, 1, 0) 
      OVER (ORDER BY DATA_VIEW.RAW_ID ASC,DATA_VIEW.ACTUAL_QTY,DATA_VIEW.UPDATE_DATE) 
      = DATA_VIEW.USED_QTY - DATA_VIEW.USED_QTY 
     THEN 0    
    ELSE 
     LAG(DATA_VIEW.USED_QTY, 1, 0) 
     OVER (ORDER BY DATA_VIEW.RAW_ID ASC,DATA_VIEW.ACTUAL_QTY,DATA_VIEW.UPDATE_DATE) 
     - DATA_VIEW.USED_QTY 
    END as SINGLE_USE_QTY 
FROM 
    DATA_VIEW 
order by RAW_ID asc, UPDATE_DATE,ACTUAL_QTY ; 

我覺得我沒有使用LAG正常運行作爲最後結果爲負值,而不是積極的。你能幫我請一些建議嗎? 的DATA_VIEW是 DATA_VIEW 而QTY_VIEW就是這樣QTY_VIEW 我做錯了什麼?

+0

你的主要'ORDER BY'不匹配'LAG'中使用'ORDER BY',所以顯示的最後一條記錄可能不是LAG中使用的最後一條記錄? –

+0

ORDER BY似乎是問題,因爲我有不同的順序。謝謝 –

回答

1

夫婦事情似乎「腥」給我..

1)你排序上RAW_ID ..這是一個字符串...它包含數字,... 您的排序順序將整理raw_1,然後raw_10 ..然後raw_11(etc)...然後raw_19,然後raw_2 ..然後raw_20 ..然後raw_21 ... etc ...然後raw_3 ..等等 您應該考慮使用一個PROPER序列...純數值..所以你可以適當地分類。

2)你的第二個CASE子句中..你..有本質:當LAG(東西)=數量 - 數量... 這基本上是:當LAG(東西)= 0 ... 是這個意?如果你是第一次出現後,它可能是更明確地說: 當LAG(東西)IS NULL你顯示爲您的結果

3)..絕對不符合他們的查詢/數據您提供的。 ..我重新鍵入所有的數據後(感謝圖像btw ..下一次,請將實際的文本,以便我們可以複製/粘貼..使我們的工作更容易幫助你:P)我不得到和你一樣的結果... 所以請重新發佈一個完整的測試案例...與適當的數據,查詢..和這樣的文本格式...所以我們可以驗證,我們不會在示例中引入錯別字;)

這就是我從你發佈的內容中得到的:

RAW_ID UPDATE_DA INITIAL_QTY ACTUAL_QTY USED_QTY SINGLE_USE_QTY 
    ------ --------- ----------- ---------- ---------- -------------- 
    raw_1 06-JUN-17  20000 48.52559 19951.47    0 
    raw_10 06-JUN-17  20000 20.76559 19979.23   -27.76 
    raw_11 06-JUN-17  20000 17.29559 19982.7   -3.47 
    raw_12 06-JUN-17  20000 13.82559 19986.17   -3.47 
    raw_13 06-JUN-17  20000 10.35559 19989.64   -3.47 
    raw_14 06-JUN-17  20000 6.885593 19996.11   -6.47 
    raw_15 06-JUN-17  20000 3.415594 19996.58   -.47 
    raw_2 06-JUN-17  20000 45.0556 19954.94   41.64 
    raw_3 06-JUN-17  20000 41.58559 19958.41   -3.47 
    raw_4 06-JUN-17  20000 38.11559 19961.88   -3.47 
    raw_5 06-JUN-17  20000 38.11559 19961.88    0 
    raw_6 06-JUN-17  20000 34.6456 19965.35   -3.47 
    raw_7 06-JUN-17  20000 31.17559 19968.82   -3.47 
    raw_8 06-JUN-17  20000 27.70559 19972.29   -3.47 
    raw_9 06-JUN-17  20000 24.23559 19975.76   -3.47 

    15 rows selected. 

這裏是我重新工作的查詢..但不知道你真正想要的..

with data_view as (
    select 'raw_1' raw_id, 1 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 48.52559 actual_qty, 19951.47 used_qty from dual union all 
    select 'raw_2' raw_id, 2 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 45.0556 actual_qty, 19954.94 used_qty from dual union all 
    select 'raw_3' raw_id, 3 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 41.58559 actual_qty, 19958.41 used_qty from dual union all 
    select 'raw_4' raw_id, 4 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 38.11559 actual_qty, 19961.88 used_qty from dual union all 
    select 'raw_5' raw_id, 5 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 38.11559 actual_qty, 19961.88 used_qty from dual union all 
    select 'raw_6' raw_id, 6 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 34.6456 actual_qty, 19965.35 used_qty from dual union all 
    select 'raw_7' raw_id, 7 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 31.17559 actual_qty, 19968.82 used_qty from dual union all 
    select 'raw_8' raw_id, 8 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 27.70559 actual_qty, 19972.29 used_qty from dual union all 
    select 'raw_9' raw_id, 9 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 24.23559 actual_qty, 19975.76 used_qty from dual union all 
    select 'raw_10' raw_id, 10 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 20.76559 actual_qty, 19979.23 used_qty from dual union all 
    select 'raw_11' raw_id, 11 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 17.29559 actual_qty, 19982.7 used_qty from dual union all 
    select 'raw_12' raw_id, 12 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 13.82559 actual_qty, 19986.17 used_qty from dual union all 
    select 'raw_13' raw_id, 13 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 10.35559 actual_qty, 19989.64 used_qty from dual union all 
    select 'raw_14' raw_id, 14 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 6.885593 actual_qty, 19996.11 used_qty from dual union all 
    select 'raw_15' raw_id, 15 raw_id2, to_date('6/6/2017 16:01','dd/mm/yyyy hh24:mi') update_date, 20000 initial_qty, 3.415594 actual_qty, 19996.58 used_qty from dual 
) 
    SELECT  
     DATA_VIEW.RAW_ID as RAW_ID, 
     DATA_VIEW.RAW_ID2 as RAW_ID2, 
     DATA_VIEW.UPDATE_DATE as UPDATE_DATE, 
     DATA_VIEW.INITIAL_QTY as INITIAL_QTY, 
     DATA_VIEW.ACTUAL_QTY as ACTUAL_QTY, 
     DATA_VIEW.USED_QTY as USED_QTY, 
     LAG(DATA_VIEW.USED_QTY, 1, 0) OVER  
       (ORDER BY DATA_VIEW.RAW_ID2 ASC,DATA_VIEW.ACTUAL_QTY,DATA_VIEW.UPDATE_DATE) 
      as lag_used_qty, 
     CASE 
      WHEN DATA_VIEW.ACTUAL_QTY = DATA_VIEW.INITIAL_QTY 
       THEN 0    
      WHEN LAG(DATA_VIEW.USED_QTY, 1, 0) OVER 
       (ORDER BY DATA_VIEW.RAW_ID2 ASC,DATA_VIEW.ACTUAL_QTY,DATA_VIEW.UPDATE_DATE) IS NULL 
       THEN 0    
      ELSE 
       LAG(DATA_VIEW.USED_QTY, 1, 0) OVER 
       (ORDER BY DATA_VIEW.RAW_ID2 ASC,DATA_VIEW.ACTUAL_QTY,DATA_VIEW.UPDATE_DATE) 
       - DATA_VIEW.USED_QTY 
     END as SINGLE_USE_QTY 
    FROM 
     DATA_VIEW 
    order by RAW_ID2 asc, ACTUAL_QTY, UPDATE_DATE ; 

和這裏的結果:

RAW_ID RAW_ID2 UPDATE_DA INITIAL_QTY ACTUAL_QTY USED_QTY SINGLE_USE_QTY 
    ------ ---------- --------- ----------- ---------- ---------- -------------- 
    raw_1   1 06-JUN-17  20000 48.52559 19951.47    0 
    raw_2   2 06-JUN-17  20000 45.0556 19954.94   -3.47 
    raw_3   3 06-JUN-17  20000 41.58559 19958.41   -3.47 
    raw_4   4 06-JUN-17  20000 38.11559 19961.88   -3.47 
    raw_5   5 06-JUN-17  20000 38.11559 19961.88    0 
    raw_6   6 06-JUN-17  20000 34.6456 19965.35   -3.47 
    raw_7   7 06-JUN-17  20000 31.17559 19968.82   -3.47 
    raw_8   8 06-JUN-17  20000 27.70559 19972.29   -3.47 
    raw_9   9 06-JUN-17  20000 24.23559 19975.76   -3.47 
    raw_10   10 06-JUN-17  20000 20.76559 19979.23   -3.47 
    raw_11   11 06-JUN-17  20000 17.29559 19982.7   -3.47 
    raw_12   12 06-JUN-17  20000 13.82559 19986.17   -3.47 
    raw_13   13 06-JUN-17  20000 10.35559 19989.64   -3.47 
    raw_14   14 06-JUN-17  20000 6.885593 19996.11   -6.47 
    raw_15   15 06-JUN-17  20000 3.415594 19996.58   -.47 

    15 rows selected. 
+0

表格由其他人制作,我無權修改其中的任何內容。我想要做的是從數據庫中獲取信息,通過3個視圖解析它,然後將其保存在其他數據庫中,該服務將每天運行。我之前舉例說明的是第二個視圖,它應該獲取數量和結果用於每個步驟的數量。我使用LAG函數來得到結果(RowN - RowN + 1)。至少這是我瞭解LAG正在做的事情。我跑了一些測試,發現目前的問題在ORDER BY。 –

+0

這種查詢需要7-9小時運行。那些日子我會運行更多的測試,我希望那是問題所在。但我知道我沒有正確使用LAG函數,並且整個語法都可能不正確。感謝您的信息和幫助。 –