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

读数是一个累积值,我需要计算上个月和当月的差异。

你能帮我弄清楚如何生成一个视图,我可以在其中查看每个月的消费(上个月读数 - 本月读数)吗?

我尝试过 between 函数:

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;

但我得到的只是每个月的读数,而不是差异。

我怎样才能让它列出每月的消费?

4

2 回答 2

8

尝试分析函数。这样的事情应该可以解决问题:

SELECT meterid, dateread, 
    reading - LAG(reading, 1, 0) OVER(PARTITION BY meterid ORDER BY dateread)
FROM meter_reading 
于 2012-11-19T18:58:32.670 回答
3

您可以使用该LAG功能获取上个月的读数。您发布的查询引用了三个表 - ServiceAddressReading,并且Meter都不是Meter_Reading您为其发布结构和数据的表。我将忽略您发布的查询,因为我不确定这些表中的数据是什么样的,并专注于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)

我假设如果没有之前的读数,你想假设之前的读数是 0

于 2012-11-19T18:59:14.173 回答