我有两张桌子,各有几列
编辑:我需要两个表中的数据。如果表1中没有时间戳记的事件,则需要显示中的记录。但是,如果存在与Table2中的时间戳相对应的事件(查询中的startTime)
Table1:
Sensor ID TimeStamp Payload1 Payload2
Table2:
Sensor ID TimeStamp EventName EventValue State
然后将剩下的结果合并到两个表中:
Result:
Sensor ID TimeStamp Payload1 Payload2 EventName EventValue State
我正在尝试找出一个可以给我正确结果集的SQL。
目前,当我尝试时会出现重复的行。结果集如下所示:
Sensor ID TimeStamp Payload1 Payload2 EventName EventValue State
2 17/06/2019 11:21:47 AM 205.8 237.9 NULL NULL NULL
2 17/06/2019 11:21:49 AM 205.8 244.1 NULL NULL NULL
2 17/06/2019 11:21:51 AM 205.8 235.8 NULL NULL NULL
2 17/06/2019 11:21:51 AM NULL NULL Event1 205.8 Critical
我想要得到的是这样的:
Sensor ID TimeStamp Payload1 Payload2 EventName EventValue State
2 17/06/2019 11:21:47 AM 205.8 237.9 NULL NULL NULL
2 17/06/2019 11:21:49 AM 205.8 244.1 NULL NULL NULL
2 17/06/2019 11:21:51 AM 205.8 235.8 Event1 205.8 Critical
我使用的查询看起来像这样
SELECT SensorID,
[TimeStamp],
Payload1 AS Payload1,
Payload2 AS Payload2,
INTO #TempTable1
FROM Feed.data
WHERE AssetId = 1
AND [TimeStamp] > GETDATE() - 0.05
ORDER BY [TimeStamp] ASC;
SELECT E.SensorID,
E.StartTime AS [TimeStamp],
ET.Name AS EventName,
E.EventValue,
E.State
INTO #TempTable2
FROM [Event] E
JOIN [EventType] ET
ON E.EventTypeId = ET.Id
WHERE E.SensorID = 1
AND ET.Id IN ( 1, 2 )
AND StartTime > GETDATE() - 0.05
--AND E.Severity != 'Normal'
ORDER BY [TimeStamp] ASC;
SELECT CASE
WHEN T1.SensorID IS NOT NULL THEN
T1.SensorID
ELSE
T2.SensorID
END AS AssetId,
CASE
WHEN [TimeStamp] IS NOT NULL THEN
TimeStamp
ELSE
EventTimeStamp
END AS TimeStamp,
Payload1,
Payload2,
T2.EventName,
T2.EventValue,
T2.State
FROM #TempTable1 T1
FULL OUTER JOIN #TempTable2 T2
ON T1.TimeStamp = T2.EventTimeStamp
AND T1.SensorID = T2.SensorID
ORDER BY [TimeStamp] ASC;
--Select * from #TempTable1
--Select * from #TempTable2
DROP TABLE #TempTable1;
DROP TABLE #TempTable2;
答案 0 :(得分:0)
使用全部并集,按时间戳分组。
select Sensor ID TimeStamp Payload1 Payload2
from Table1
Group by Sensor ID, TimeStamp
Union all
select Sensor ID TimeStamp EventName EventValue State
from Table 2
Group by Sensor ID TimeStamp
您也可以使用并集,并集会删除重复的行。
全部并不会删除重复的行。
->根据要求使用运算符(全部或全部合并)。
答案 1 :(得分:0)
以下查询应执行您想要的操作
SELECT ISNULL(t1.[SensorID],t2.[SensorID]) AS [AssetId]
,ISNULL(t1.[TimeStamp],t2.[TimeStamp]) AS [EventTimeStamp]
,t1.[Payload1]
,t1.[Payload2]
,t2.[EventName]
,t2.[EventValue]
,t2.[State]
FROM Feed.data t1
OUTER APPLY ( -- CROSS APPLY in case you need matching records alone
SELECT E.[SensorID]
,E.[StartTime] AS [TimeStamp]
,ET.[Name] AS EventName
,E.[EventValue]
,E.[State]
FROM [Event] E
JOIN [EventType] ET
ON E.[EventTypeId] = ET.[Id]
WHERE E.[SensorID] = 1
AND ET.[Id] IN ( 1, 2 )
AND E.[StartTime] > GETDATE() - 0.05
AND t1.[TimeStamp] = E.[StartTime]
AND t1.[SensorID] = E.[SensorID] ) t2
WHERE t1.[AssetId] = 1
AND t1.[TimeStamp] > GETDATE() - 0.05
ORDER BY ISNULL(t1.[TimeStamp],t2.[TimeStamp]) ASC
答案 2 :(得分:0)
您需要使用联接两个表,然后选择所需的列。 INNER JOIN将返回两个表中都具有Sensor ID的记录。但是,如果您想查看至少在表1中可用的记录,只需将INNER JOIN替换为LEFT JOIN。
SELECT
[Sensor ID],TimeStamp,
Payload1,Payload2,
EventName,EventValue,State
FROM Table1 A
INNER JOIN Table2 B ON A.[Sensor ID] = B.[Sensor ID]
-- Above is the basic query. You can now
-- add filtering with the query as per your requirement as-
WHERE A.[TimeStamp] > GETDATE() - 0.05
答案 3 :(得分:0)
我将使用一个简单的联合查询,并通过分组将两个数据组合在一起。假设数据在哪张表中都没有匹配,这将不管数据在哪张表中都起作用。
select SensorID, [Timestamp],
max(PayLoad1) PayLoad1,
max(PayLoad2) PayLoad2,
max(EventName) EventName,
max(EventValue) EventValue,
max([State]) [State]
from (
select SensorID, [TimeStamp], PayLoad1, PayLoad2,
null EventName, null EventValue, null [State]
from table1
union
select SensorID, [TimeStamp], null PayLoad1, null PayLoad2,
EventName, EventValue, [State]
from table2
) q
group by SensorID, [Timestamp]