Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语句以匹配最接近的日期?_Sql_Sql Server - Fatal编程技术网

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肯定会有所帮助。