我有下表,我们称之为Names
:
Name Id Date
Dirk 1 27-01-2015
Jan 2 31-01-2015
Thomas 3 21-02-2015
接下来,我有另一个名为Consumption
的表:
Id Date Consumption
1 26-01-2015 30
1 01-01-2015 20
2 01-01-2015 10
2 05-05-2015 20
现在的问题是,我认为使用SQL执行此操作是最快的,因为该表包含大约150万行。
所以问题如下,我想将Names
表中的每个Id与Consumption
表匹配,前提是dates
之间的差异最小,所以我们:Dirk
消费27-01-2015
约30
。如果有两个日期具有相同的“差异”,我想计算这两个日期的平均消费量。
虽然我知道如何加入,但我不知道如何编写差异部分。
感谢。
DBMS是Microsoft SQL Server 2012。
我认为我的问题与评论中提到的问题不同,因为它更复杂,因为它涉及比较两个表之间的日期而不是一个日期并将其与表中其余日期进行比较。
答案 0 :(得分:4)
这就是SQL Server中的方法:
SELECT Id, Name, AVG(Consumption)
FROM (
SELECT n.Id, Name, Consumption,
RANK() OVER (PARTITION BY n.Id
ORDER BY ABS(DATEDIFF(d, n.[Date], c.[Date]))) AS rnk
FROM Names AS n
INNER JOIN Consumption AS c ON n.Id = c.Id ) t
WHERE t.rnk = 1
GROUP BY Id, Name
将RANK
与PARTITION BY n.Id
和ORDER BY ABS(DATEDIFF(d, n.[Date], c.[Date]))
一起使用,您可以找到每个Id
的所有匹配记录:所有天数差异最小的记录都将{{1} }。
然后,在外部查询中使用rnk = 1
,您将计算所有匹配记录之间AVG
的平均值。