【问题标题】:SQL join incomplete tableSQL连接不完整的表
【发布时间】:2013-08-16 13:50:43
【问题描述】:

假设我有两张桌子(见图)。在一个中我有日期,在另一个中我计算了第一个日期中的一些日期。

我需要加入这些表,因此我对表 Dates 中的每个日期都有最新计数(截至该日期)。 例如,对于 [Dates].[date]=3,我没有 [Counts].[Count],所以我必须计算 [date]=1。

在 SQL 中执行此操作的最佳方法是什么?

希望你能理解我:)

谢谢!!

【问题讨论】:

  • 你能提供结构和样本数据吗?也许在sqlfiddle.com
  • 这不能同时是mysql和sql server。是哪个?
  • 使用 WINDOW 函数 Lead() 加上聚合 SUM() 看起来很简单顺便说一句:日期是保留字(类型名),计数(聚合函数)也是如此 对于 mysql(缺少 WINDOW 函数)您必须使用 MAX() 和/或 NOT EXISTS 来使用自联接。
  • 我认为您在显示预期结果时弄错了,由于日期 2 和 3 不存在于计数中,因此结果应该为 0
  • @SashiKant - 这正是问题所在,这不是一个简单的左连接。在 Joachim 的答案中运行小提琴,看看它是否有效。

标签: mysql sql sql-server performance


【解决方案1】:

您可以使用LEFT JOIN 来执行此操作;使用带有空检查的额外左连接来确保不存在更新的匹配日期;

SELECT d.`date`, c.`count`
FROM dates d
LEFT JOIN counts c  ON d.`date` >= c.`date`
LEFT JOIN counts c2 ON d.`date` >= c2.`date` AND c.`date`<c2.`date`
WHERE c2.`date` IS NULL;

An SQLfiddle to test with.

【讨论】:

    【解决方案2】:

    您也可以使用相关子查询来做到这一点:

    select d.date,
           (select c.count
            from counts c
            where d.date >= c.date
            order by c.date desc
            limit 1
           ) as count
    from dates d;
    

    如果您在counts(date, count) 上有索引,这甚至应该是相对有效的。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多