根据位置字段和最近的日期字段更新字段

时间:2015-08-10 03:48:46

标签: sql ms-access

我是使用Access和SQL的新手,我正在尝试创建一个跟踪不同属性用水量的数据库 目前用于这样做的方法是获取抄表并记录该值。这进入表Meter Reading,其中包含4个主要字段:PropertyMeterDateReading

我想为Last Reading添加第5列。理想情况下,此列将执行更新并将Last Reading设置为先前读取的仪表。

实施例

Property  Meter     Date          Reading   Last Reading
1         A         2/2/2015      4518      1X
2         B         2/2/2015      1258      2X
1         A         3/2/2015      4595      3X

我想要做的是Last Reading提交给我告诉我上次读取电表的时间,以及3X点会更新显示4518,因为那是最后一次读取属性1,米A时的值。然后我可以轻松地做一个数学领域来获得差异。

我试过了

Update [Meter Reading}
Set [Last Reading]= Reading
Where Date=Max

它只会将阅读值复制到最后阅读中,所以它没有帮助。 我也尝试过做

Update [Meter Reading]
Set [Last Reading]=(Select Reading

*这是我遇到麻烦的地方我没有能够选择正确的属性,仪表和日期来选择合适的阅读材料。 我不知道这是否可能,但欢迎任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

我通过VBA执行类似的操作,您可以在其中打开记录集并按特定顺序排序,这样您就可以循环访问数据并使用上一条记录中的值更新每条记录。我不能保证它漂​​亮或高效,但它完成了工作。而且我个人会连接这个属性&米,因为组合似乎是你唯一的标识符?这就是我。

Public Function GetLastReadingByMeter()
Dim db As DAO.Database, rs As DAO.Recordset, strSQL As String
Dim strMeter As String, intReading As Integer

DAO.DBEngine.SetOption dbMaxLocksPerFile, 9999

Set db = CurrentDb()

Set rs = db.OpenRecordset("select * from your_table_name order by property_meter, date", dbOpenDynaset)

rs.MoveFirst
strMeter = rs.Fields("property_meter").Value
intReading = rs.Fields("Reading").Value
rs.Edit
'If you want the first row's last reading equal to itself this line below does it (retrofit from my original dates), else you could set this to zero
rs.Fields("LastReading").Value = rs.Fields("Reading").Value
rs.Update
rs.MoveNext
Do Until rs.EOF
    If strMeter = rs.Fields("property_meter").Value Then
        rs.Edit
        rs.Fields("LastReading").Value = intReading
        rs.Update
        intReading = rs.Fields("Reading").Value
    Else
        rs.Edit
        rs.Fields("LastReading").Value = rs.Fields("Reading").Value
        rs.Update
        strMeter = rs.Fields("property_meter").Value
        intReading = rs.Fields("Reading").Value
    End If
    rs.MoveNext
Loop

End Function