SQL语句匹配最接近的日期?

时间:2015-03-26 12:20:54

标签: sql sql-server

我有下表,我们称之为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-201530。如果有两个日期具有相同的“差异”,我想计算这两个日期的平均消费量。

虽然我知道如何加入,但我不知道如何编写差异部分。

感谢。

DBMS是Microsoft SQL Server 2012。

我认为我的问题与评论中提到的问题不同,因为它更复杂,因为它涉及比较两个表之间的日期而不是一个日期并将其与表中其余日期进行比较。

1 个答案:

答案 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

RANKPARTITION BY n.IdORDER BY ABS(DATEDIFF(d, n.[Date], c.[Date]))一起使用,您可以找到每个Id的所有匹配记录:所有天数差异最小的记录都将{{1} }。

然后,在外部查询中使用rnk = 1,您将计算所有匹配记录之间AVG的平均值。

SQL Fiddle Demo