Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 Server合并数据_Sql_Sql Server - Fatal编程技术网

SQL Server合并数据

SQL Server合并数据,sql,sql-server,Sql,Sql Server,我有两个表,一个包含ID号和DateTime(主表)。另一个表具有ID、LocationName和DateTime(位置表) 主表中的日期时间是自动信号的频繁捕获。位置表中的日期时间是对象移动到新位置的时间。这两个ID都是主键和链接 我试图做的是只生成一个表,显示位置发生更改的时间,显示主表中的ID、DateTime和位置表中的LocationName 我已经试了好几个小时了,但似乎做不到 下面是表格和最终结果的示例 任何帮助都将不胜感激 谢谢 MAIN TABLE Loca

我有两个表,一个包含ID号和DateTime(主表)。另一个表具有ID、LocationName和DateTime(位置表)

主表中的日期时间是自动信号的频繁捕获。位置表中的日期时间是对象移动到新位置的时间。这两个ID都是主键和链接

我试图做的是只生成一个表,显示位置发生更改的时间,显示主表中的ID、DateTime和位置表中的LocationName

我已经试了好几个小时了,但似乎做不到

下面是表格和最终结果的示例

任何帮助都将不胜感激

谢谢

MAIN TABLE           Location Table

ID DateTime          ID DateTime         Location 
-----------------    ----------------------------
1  20200101 12:00    1  20200101 11:45   Loc 1
1  20200101 13:00    1  20200101 13:45   Loc 2
1  20200101 14:00    2  20200101 15:15   Loc 1
2  20200101 15:00    2  20200101 17:30   Loc 2
2  20200101 17:00    
要将表格显示为:

ID DateTime       Location 
---------------------------
1  20200101 12:00 Loc 1
1  20200101 13:00 Loc 2
1  20200101 14:00 Loc 2
2  20200101 15:00 Loc 1
2  20200101 17:00 Loc 2


这是一个生成或更改主表中数据的输出

可以通过使用嵌套的选择来获得与Main.DATETIME

SELECT MAIN.ID,MAIN.DATETIME,
    (SELECT TOP 1 B.Location
     FROM Location AS B
     WHERE B.ID = MAIN.ID
     ORDER BY CASE
                WHEN DATEDIFF(MINUTE, MAIN.DATETIME, B.DATETIME)>=0
                THEN DATEDIFF(MINUTE, MAIN.DATETIME, B.DATETIME)
                ELSE DATEDIFF(MINUTE, B.DATETIME, MAIN.DATETIME)
     END asc) AS Location 
FROM MAIN
结果:

您是说
主表中的最后一条记录(按日期时间)应该显示位置表中的最后一个位置(按日期时间)?位置表中每个ID是否有超过两条记录?使用此选项检查:
SELECT ID,COUNT(*)FROM[Location Table]GROUP BY ID have COUNT(*)>2
Sorry,no。我已更正了数据。在主表中,位置应按日期时间顺序显示。但有时,位置时间可能早于开始时的主表DateTime。我们仍然不清楚您要应用什么规则来决定最终表中的id 1是使用Loc1还是Loc2。基本上,第一个条目应该显示第一个位置,然后,如果位置发生变化,则通过匹配时间来匹配新位置。我基本上是想显示信号在主表中的位置。因此,对于结果中ID 1第二行,您不关心
LocationTable
(13:45)中的日期时间是否在主表上的日期时间(13:00)之后?LOC字段完全为空?抱歉,不起作用。主DateTime和Location DateTime很少匹配,但它们将匹配小时(有时第一个条目除外)。但是我需要显示第一个位置,而不考虑日期时间,并在后续行中显示该位置。如果位置更改,显示更改对不起,这也不起作用。没有连接到主ID。我已经通过在嵌套的SELECT上添加WHERE子句来更新答案,以连接主ID。我担心它在我拥有的较大数据集上仍然不起作用,而且资源非常密集。是的,我认为是这样。因为查询非常消耗性能。
SELECT MAIN.ID,MAIN.DATETIME,
    (SELECT TOP 1 B.Location
     FROM Location AS B
     WHERE B.ID = MAIN.ID
     ORDER BY CASE
                WHEN DATEDIFF(MINUTE, MAIN.DATETIME, B.DATETIME)>=0
                THEN DATEDIFF(MINUTE, MAIN.DATETIME, B.DATETIME)
                ELSE DATEDIFF(MINUTE, B.DATETIME, MAIN.DATETIME)
     END asc) AS Location 
FROM MAIN