【问题标题】:Referencing two adjacent rows in a relational database引用关系数据库中的两个相邻行
【发布时间】:2015-03-01 04:04:10
【问题描述】:

在我的数据库中,我有一个表,它必须从另一个表的两个相邻行中获取信息。

请允许我演示一下。有一个账单计算两个 相邻 仪表值之间的差异并相应地计算成本(即,我有一个水表,如果我想计算我应该在 12 月支付的金额,我取这个值我在 11 月测量,然后从 12 月减去)。

我的问题是,如何以最佳方式实现引用?我在想:

  • 使每个仪表值独立成为一个实体。然后账单将有两个外键,一个用于每个仪表值。这样我就可以包含其他有用的数据,比如测量日期等。但是,实现和验证邻接变得很棘手。
  • 使一对计量值成为一个实体(或计量值和差异)。该法案将引用该对。但是,这会导致数据重复。

有没有更好的方法?非常感谢。

【问题讨论】:

    标签: sql database architecture


    【解决方案1】:

    首先,关系数据库中不存在“相邻”行。表代表无序集。如果您有排序的概念,则需要使用行中的数据来实现。让我假设您有某种“id”或“创建日期”来指定排序。

    因为您没有指定数据库,所以我假设您有一个支持 ANSI 标准窗口函数的函数式数据库。在这种情况下,您可以使用 LAG() 函数获得所需的内容。获取上一个仪表读数的语法类似于:

    select lag(value) over (partition by meterid order by readdatetime)
    

    没有必要有数据重复或一些神秘的数据数据结构。 LAG() 也应该能够利用适当的索引。

    【讨论】:

    • 我打算使用 PostgreSQL,但我真的想让它尽可能通用。非常感谢!
    • ANSI 标准功能通常非常可移植(但哦,也有例外)。 Postgres 绝对支持这一点,大多数(如果不是全部)Postgres 派生数据库、Oracle、SQL Server、Teradata 和 DB2(仅举几例)也是如此。
    • 谢谢!所以,如果我理解正确,要在一个查询中获取两个值,我需要执行两个连接,其中一个会获取当前值,另一个会通过滞后过滤掉前一个值,对吗?
    • @art-solopov 。 . .不,您只需使用lag() 来获取先前的值。然后你可以用它做你想做的事。 . .例如在计算中使用它。
    • 哦,谢谢!我一开始没有得到你。非常感谢,真的很有用,以前真的不知道!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多