【问题标题】:Creating a view that shows the balance of accounts on every day, when the "balance" table only has entries on those days where the balance changes当“余额”表仅包含余额发生变化的那些日子的条目时,创建一个显示每天帐户余额的视图
【发布时间】:2013-10-06 00:05:46
【问题描述】:

我有 2 个表需要以特定方式加入。 “日期”是一个单列表,仅显示从 1990 年到 2040 年的每一天。 “余额”有数百个银行账户的余额。诀窍:只有当账户余额发生变化时,数据库才会在“余额”中为该账户创建一个新条目。一旦帐户有新余额,就会创建一个新条目。余额保持不变的日子没有条目。

现在我需要创建一个视图来显示每天所有帐户的余额。这意味着我必须显示“日期”中的日期以及每个帐户的相应余额。当我加入这两个表时,在某一天,我只能看到当天发生变化的那些账户,而看不到没有变化的账户余额。我该如何解决这个问题?

“日期”

Date

1.1.1990  
2.1.1990  
3.1.1990

“余额”

  Date      Account     Balance  

  1.1.1990    1             100
  1.1.1990    2              60
  1.1.1990    3               0
  2.1.1990    2              50
  3.1.1990    1             150

想要的结果

  Date      Account     Balance  
  1.1.1990    1             100
  1.1.1990    2              60
  1.1.1990    3               0
  2.1.1990    1             100
  2.1.1990    2              50
  2.1.1990    3               0
  3.1.1990    1             150
  3.1.1990    2              50
  3.1.1990    3               0

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?这可以使用窗口函数和“运行总和”轻松完成。

标签: sql date join


【解决方案1】:

如果您提供表和一些示例数据的描述,则提供更正确的查询会更容易。但是,我认为这个查询会起作用 - 它会从 BALANCE 返回最接近给定日期的行:

SELECT * FROM DATES d, BALANCE b
WHERE d.date >= b.date
      AND b.date >= ALL (SELECT b1.date FROM BALANCE b1
                    WHERE b1.date <= d.date
                          AND b1.account = b.account)

此查询应提供所需的结果:

SELECT d.date, b.account, b.balance FROM DATES d, BALANCE b
WHERE d.date >= b.date
      AND b.date >= ALL (SELECT b1.date FROM BALANCE b1
                         WHERE b.account = b1.account
                               AND d.date >= b1.date)
ORDER BY d.date, b.account

【讨论】:

  • 感谢您的回答。我添加了一些示例数据和所需结果的示例。
  • @user2463153 编辑了答案,新查询应该可以正常工作。
  • 您的答案似乎有效。你能解释一下这个查询背后的逻辑吗?
  • @user2463153 此查询采用表 DATES 和 BALANCE 的所有可能行组合,其中余额中的日期值早于日期中的日期值,之后它只留下行,其中每个给定帐户和给定date from DATES 来自 BALANCE 的日期是最接近 DATES 值的日期。
【解决方案2】:

以下是更简洁的方法,其中 DATES 是日期表,其中 D 作为日期属性,BALANCE 是余额表,其属性 BAL_DATE 为余额日期,AMOUNT 为当前余额:

SELECT SUB.D, B.AMOUNT
FROM (
    SELECT D.D AS D,MAX(B.BAL_DATE) AS BD
    FROM DATES D, BALANCE B
    WHERE D.D>=B.BAL_DATE
    GROUP BY D.D) AS SUB, BALANCE B
WHERE SUB.BD = B.BAL_DATE
ORDER BY SUB.D

SUB 子查询将所有日期行与日期小于或等于相应日期行的余额行匹配,并且对于每个日期行,获取具有最大日期的余额行,即。 e.如果两个日期相等,则为最近的余额或当前余额。 外部主查询的目的是获取每个日期对应的金额。

【讨论】:

  • 谢谢。您的查询比上述查询快得多,但结果不是我需要的。我不知道为什么,但结果中缺少很多日期。
  • 这些日期是来自日期表还是来自余额表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多