2012-11-19 85 views
2

我有一個表累積差異

Meter_Reading 

MeterID | Reading  |  DateRead  | 
1    10    1-Jan-2012 
1    20    2-Feb-2012 
1    30    1-Mar-2012 
1    60    2-Apr-2012 
1    80    1-May-2012 

閱讀是一個累積值,其中我需要計算從上月和本月的差別。

你能幫我弄清楚如何生成一個視圖,我可以看到每個月的消耗量(上個月的讀數 - 當前月份讀數)?

我曾試圖功能之間:

select address, reading as Consumption, dateread 
from ServiceAddress, reading, meter 
where address like '53 Drip Drive%' 
and dateread 
between (to_date('01-JAN-2012','DD-MON-YYYY')) and (to_date('30-SEP-2012', 'DD-MON-YYYY')) 
and serviceaddress.serviceaddid = meter.serviceaddid and meter.meterid = reading.meterid; 

但我得到的是每月不差的讀數。

我怎樣才能讓它列出每月消費?

+0

如果一個月不見了會發生什麼? –

+0

我想它會跳過它? –

回答

3

您可以使用LAG函數來獲取前一個月的讀數。您發佈的查詢引用三個表格 - ServiceAddress,ReadingMeter,其中沒有哪個表格是Meter_Reading表中發佈的結構和數據。我會忽略對您發佈的數據

SELECT MeterID, 
     DateRead, 
     Reading, 
     PriorReading, 
     Reading - PriorReading AmountUsed 
    FROM (SELECT MeterID, 
       DateRead, 
       Reading, 
       nvl(lag(Reading) over (partition by MeterID 
              order by DateRead), 
        0) PriorReading 
      FROM meter_reading) 

我承擔Meter_Reading表你張貼,因爲我不知道這些表中的數據看起來像查詢和重點,如果沒有事先讀數你想假設之前的讀數爲0

+0

是的,我很抱歉,我沒有解釋其他表結構,我相信這將不需要這個查詢。非常感謝。 –

+0

嗨賈斯汀,我可以確認「PriorReading PriorReading」行沒有目的嗎?我可以簡單地放上「PriorReading」。從我執行它似乎可能。 –

+0

@ChrisPin - 別名沒有意義,是的。我最初是在外層查詢中應用'NVL',而不是在內層查詢中使用,因此別名原來就是爲此而存在的。我更新了我的答案,以消除多餘的別名 –

7

試用analytic functions。像這樣的應該做的伎倆:

SELECT meterid, dateread, 
    reading - LAG(reading, 1, 0) OVER(PARTITION BY meterid ORDER BY dateread) 
FROM meter_reading 
+0

非常感謝。哇。有趣的是真棒。分析功能,感謝您的鏈接:D –