我需要帮助来计算一个仪表消耗的基础上采取的当前价值每月
我有以下表格:
地址(PostCode整型,街道可变字符)
仪表(MeterID int,InstallationDate date,PostCode int)
正在读取(ReadNo int,ReadDate date,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;地址的仪表更换为新仪表时出现问题,有谁能帮我解决吗?
发布于 2012-11-12 01:37:14
我相信很多人都会感谢你的!
通过在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发布于 2012-11-12 02:24:12
您的模式是否将仪表(服务)与场所相关联?如果您使用的是商业客户信息系统,所有这些系统都会这样做,并要求使用它来生成账单。有一个服务表,每个服务都住在一个场所。邮寄地址可能与办公地点相同,也可能不同。邮寄地址与客户相关联,例如:一家连锁餐厅有一个总部和20家餐厅。他们在总部收到账单,所以所有的邮寄地址都是相同的,服务的20个物理地址可能非常不同。
如果您为此推出了自己的模式,则需要考虑实用程序计费的实际工作原理。即使这只是一个玩具模型。
在过去的30年里,我在很多系统上都这样做过。它们的工作原理都与上面的类似。
https://stackoverflow.com/questions/13333424
复制相似问题