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