【问题标题】:Join tables on nearest date in the past, in MySQL在 MySQL 中,在过去最近的日期加入表
【发布时间】:2011-03-18 12:03:13
【问题描述】:

我有一个正在尝试编写的 sqlite 查询。我有两张桌子:

表A(销售): ID 销售量 日期

表 B(目标): ID 目标 日期

我从 TableA 中选择这样的: 从表 A 中选择 id、销售额、日期

现在到“棘手”的部分。我需要将 TableB 加入查询,因为我需要 TableB 中的目标字段对于 TableA 中的每一行TableB 仅包含某些日期的目标,而 TableA 包含所有日期。所以我不能只使用 TableA.date = TableB.date

相反,对于 TableA 中的每一行,我需要在过去最接近 TableA 日期的日期从 TableB 中获取目标。希望我能够解释我需要什么。不知道怎么做..

【问题讨论】:

    标签: sql date join


    【解决方案1】:

    只需获取笛卡尔积,然后过滤掉不感兴趣的行。基本上:

    select a.*, b.*
    from a, b
    where
    not exists (
      select null
      from b b2
      where abs(b2.date - a.date) < abs(b.date - a.date)
    )
    

    我不知道 SQLite 是否支持,很难。

    【讨论】:

      【解决方案2】:
      SELECT a.id, a.sales, a.date, (SELECT TOP 1 Goal 
                                     FROM TableB b WHERE b.date < a.date
                                     ORDER BY b.date DESC) As Goal
      FROM TableA a
      

      从过去最近的日期开始。

      【讨论】:

      • 这很好,但唯一的问题是您还需要测试 id。
      【解决方案3】:

      “完全相等的日期”将是日期字段的连接。 (如 Ash 的回答)

      “最近的日期”可能应该读作“未来的最近日期”或“过去的最近日期”(或者可能不是)。在这种情况下,您可以使用带有 WHERE 语句的子查询来比较日期()

      如果“最近的日期”既是过去的又是现在的,我可能会通过编写一个存储过程来对其进行编码,该存储过程会创建一个帮助表,其中包含表 A 中每个日期的最相关的“最近的日期”(来自 B)。这样我就可以更好地控制程序的行为,并且将来更容易改变。

      性能优化总是可以在以后进行。

      【讨论】:

      • 谢谢!我更新了这个问题,因为它总是过去最近的日期。但是我不确定如何编写子查询对吗?
      猜你喜欢
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多