2013-08-16 51 views
2

想象我有两个表(请参见图片)。在一个我有日期,另一个我有一个在第一个日期的计数。SQL连接不完整表

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

在SQL中这样做的最好方法是什么?

我希望你能理解我:)

谢谢!!

enter image description here

+1

你能提供结构和样品数据吗?也许在http://sqlfiddle.com – Kris

+2

这不能既是mysql和sql server。这是什么? – Hogan

+0

使用WINDOW函数lead()加上一个聚合SUM()BTW:date是一个保留字(typename),所以count(聚合函数)对于mysql(它缺少WINDOW函数),你必须使用使用MAX()和/或NOT EXISTS进行自连接。 – joop

回答

5

您可以使用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

1

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

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)有一个索引。