引用关系数据库中的两个相邻行
Referencing two adjacent rows in a relational database
在我的数据库中,我有一个 table 必须从另一个 table 的两个相邻行获取信息。
请允许我演示。有一张账单计算两个 相邻 表值之间的差异并相应地计算成本(即,我有一个水表,如果我想计算我应该在 12 月支付的金额,我取我在 11 月测量的值,并从 12 月的值中减去它)。
我的问题是,如何以最佳方式实现引用?我在想:
- 使每个仪表值成为一个独立的实体。账单将有两个外键,每个外键对应一个计量值。这样我就可以包括其他有用的数据,比如测量日期等等。然而,实施和验证邻接变得很棘手。
- 使一对仪表值成为一个实体(或一个仪表值和一个差异)。该法案将参考那对。但是,这会导致数据重复。
有没有更好的方法?非常感谢。
首先,关系数据库中没有 "adjacent" 行这样的东西。表代表无序集。如果您有排序的概念,则需要使用行中的数据来实现。让我假设您有某种指定顺序的 "id" 或 "creation date"。
因为您没有指定数据库,所以我假设您有一个支持 ANSI 标准 window 函数的功能数据库。在这种情况下,您可以使用 LAG()
函数获得您想要的。获取先前仪表读数的语法类似于:
select lag(value) over (partition by meterid order by readdatetime)
不需要数据重复或一些神秘的数据数据结构。 LAG()
也应该能够利用适当的索引。
在我的数据库中,我有一个 table 必须从另一个 table 的两个相邻行获取信息。
请允许我演示。有一张账单计算两个 相邻 表值之间的差异并相应地计算成本(即,我有一个水表,如果我想计算我应该在 12 月支付的金额,我取我在 11 月测量的值,并从 12 月的值中减去它)。
我的问题是,如何以最佳方式实现引用?我在想:
- 使每个仪表值成为一个独立的实体。账单将有两个外键,每个外键对应一个计量值。这样我就可以包括其他有用的数据,比如测量日期等等。然而,实施和验证邻接变得很棘手。
- 使一对仪表值成为一个实体(或一个仪表值和一个差异)。该法案将参考那对。但是,这会导致数据重复。
有没有更好的方法?非常感谢。
首先,关系数据库中没有 "adjacent" 行这样的东西。表代表无序集。如果您有排序的概念,则需要使用行中的数据来实现。让我假设您有某种指定顺序的 "id" 或 "creation date"。
因为您没有指定数据库,所以我假设您有一个支持 ANSI 标准 window 函数的功能数据库。在这种情况下,您可以使用 LAG()
函数获得您想要的。获取先前仪表读数的语法类似于:
select lag(value) over (partition by meterid order by readdatetime)
不需要数据重复或一些神秘的数据数据结构。 LAG()
也应该能够利用适当的索引。