0

我需要帮助来根据每月获取的当前值计算电表的消耗

我有以下表格:

地址(PostCode int, Street varchar)
Meter(MeterID int, InstallationDate date, PostCode int)
Reading(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;

当地址的电表被新电表替换时会出现问题,有人可以帮我解决这个问题吗?

4

2 回答 2

1

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

通过ORDER BY READVALUE在 LAG 中使用,您计算的是下一个最大值(默认排序顺序是升序),而不是最后一个值。这应该是

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-11T17:37:14.087 回答
0

您的模式是否不将计量(服务)与场所相关联?如果您使用的是商业客户信息系统,它们都会这样做并要求使用它来生成账单。有一个服务表,每个服务都位于一个场所。邮寄地址可能与房屋相同,也可能不同。邮寄地址与客户相关联,例如:一家连锁餐厅有一个主办公室和 20 家餐厅。他们在总公司收到账单,所以所有的邮寄地址都是一样的,服务的 20 个物理地址可能非常不同。

如果您为此推出了自己的架构,则需要考虑公用事业计费的实际运作方式。即使这只是一个玩具模型。

在过去的 30 年里,我在很多系统上都这样做了。它们都像上面那样工作。

于 2012-11-11T18:24:12.263 回答