SQL语句以匹配最接近的日期?
我有下表,让我们称之为SQL语句以匹配最接近的日期?,sql,sql-server,Sql,Sql Server,我有下表,让我们称之为名称: Name Id Date Dirk 1 27-01-2015 Jan 2 31-01-2015 Thomas 3 21-02-2015 接下来是另一个名为消费量的表: Id Date Consumption 1 26-01-2015 30 1 01-01-2015 20 2 01-01-2015 10 2 05-05-2015 20 现在的问题是,我认为使用SQL执行此操作最快,因为
名称
:
Name Id Date
Dirk 1 27-01-2015
Jan 2 31-01-2015
Thomas 3 21-02-2015
接下来是另一个名为消费量的表:
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万行
因此问题如下,我想将名称
表中的每个Id与消费
表匹配,前提是日期
之间的差异最小,因此我们有:Dirk
在27-01-2015
关于30
消费。如果有两个日期具有相同的“差异”,我想计算这两个日期的平均消费量
虽然我知道如何加入,但我不知道如何对差异部分进行编码
谢谢
DBMS是Microsoft SQL Server 2012
我相信我的问题与评论中提到的问题不同,因为它要复杂得多,因为它涉及两个表之间的日期比较,而不是一个日期与表中的其他日期进行比较。在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
和按n.Id划分的和按ABS排序的(DATEDIFF(d,n.[Date],c.[Date])
可以根据Id
找到所有匹配的记录:所有天数差异最小的记录都将具有rnk=1
然后,在外部查询中使用AVG
,计算所有匹配记录之间消耗量的平均值
以下是您在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
和按n.Id划分的和按ABS排序的(DATEDIFF(d,n.[Date],c.[Date])
可以根据Id
找到所有匹配的记录:所有天数差异最小的记录都将具有rnk=1
然后,在外部查询中使用AVG
,计算所有匹配记录之间消耗量的平均值
哪个数据库管理系统?若它是mysql,那个么上面的问题将为你们提供你们所需要的。如果是Sql server,请使用行编号()。这是一个更复杂的问题。但是一种DBMS肯定会有帮助。哪种DBMS?若它是mysql,那个么上面的问题将为你们提供你们所需要的。如果是Sql server,请使用行编号()。这是一个更复杂的问题。但是一种DBMS肯定会有所帮助。