2012-11-11 54 views
0

我需要帮助每个月计算所采取的电流值一米基础的消费使用滞后()来进行计算

我有以下表格:

地址(邮编INT,街VARCHAR)
仪表(MeterID INT,InstallationDate日期,邮编INT)
阅读(ReadNo INT,ReadDate日期,ReadValue INT,MeterID INT,ReaderID INT)

我试过如下:

Select ReadDate, 
     ReadValue AS CurrentValue, 
     lag(readvalue, 1, 0) OVER (ORDER BY READVALUE) AS PreviousValue, 
     readvalue - lag(readvalue, 1, 0) OVER (ORDER BY READVALUE) AS Consumption 
From Reading R, 
     Meter M, 
     Address A 
Where R.MeterID = M.MeterID 
    AND A.PostCode = M.PostCode AND A.PostCode = '1005' 
Order By ReadDate; 

问题发生时,该地址的仪表是由一个新的仪表替换,谁能帮助我吗?

回答

1

我相信很多人都会感谢你!

通过在LAG使用ORDER BY READVALUE你计算下一个最高值(默认的排序顺序是升序)不是最后拿到了。这应该是

lag(readvalue, 1, 0) over (order by readdate desc) 

获取先前读取的值。

你不必在你的地址表足够的信息来确定表是否在同一地址或没有。没有建筑物号码等。因此,对您的问题的正确答案是社会性的,与数据库无关。如果有人有两米发出两张账单。

然而,假设地址表确实有足够的信息,以便能够唯一标识一个地址,即每个邮政编码是一个单一的建筑那么你已经在做正确的事情,虽然我会重新按以下方式组织您的查询(并停止引用整数)。

select r.readdate 
    , r.readvalue - lag(r.readvalue, 1, 0) over (order by readdate desc) 
    from address a 
    join meter m 
    on a.postcode = m.postcode 
    join reading r 
    on m.meterid = r.meterid 
where a.postcode = 1005 
order by readdate desc 

您正在选择每个邮政编码表,然后每个阅读所有这些米。如果在读数之间安装了一个新仪表,你很好。

这似乎不太可能会奏效;应该有前一个电表的最后读数,否则readvalue将高于该值的滞后,这会使您回到两个账单情形。或者,您需要一种显示账单在数据库中何时“最终”的方法。

要获得最新值则只需将所有这一切在一分选,然后选择最上面一行:

select * from (<above query>) where rownum < 2 
0

请问您的架构无关米(服务)房地?如果您正在使用商业客户信息系统,他们都会这样做,并要求用它来生成账单。有一张服务表,其中每项服务都住在一处。邮寄地址可能与房产相同或不同。邮寄地址与客户相关联,例如:连锁餐厅有一个主办公室和20间餐厅。他们在主办公室得到账单,所以所有的邮寄地址都是一样的,这20个物理地址的服务可能是非常不同的。

如果推出自己的模式为此,你需要想通过电费计费实际上是如何工作的。 即使这只是一个玩具模型。

我已经在很多系统上完成了过去30年的测试。他们都像上面那样工作。

+0

嗨吉姆,介意为我审查ERD?我怀疑它是否能起到作用。非常感谢你的帮助。 – FirstTimer