Объединить и показать данные из нескольких таблиц - PullRequest
1 голос
/ 17 июня 2019

У меня есть две таблицы с соответствующими столбцами

РЕДАКТИРОВАТЬ: мне нужны данные из обеих таблиц. Если в Таблице 1 нет события для отметки времени, мне нужна запись на дисплее. Но если есть события, соответствующие TimeStamp из таблицы 2 (startTime в запросе)

Table1:                     
Sensor ID   TimeStamp   Payload1    Payload2            

Table2:                     
Sensor ID   TimeStamp   EventName   EventValue  State   

А затем получим результат rest, который объединит две таблицы:

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;

Ответы [ 4 ]

0 голосов
/ 17 июня 2019

Я бы использовал простой запрос на объединение и сгруппировал, чтобы объединить два набора данных. Это будет работать независимо от того, к какой таблице относятся данные, при условии, что в другой таблице нет совпадений.

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]
0 голосов
/ 17 июня 2019

Следующий запрос должен делать то, что вы хотите,

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
0 голосов
/ 17 июня 2019

Вам необходимо использовать объединение обеих таблиц, а затем выбрать необходимые столбцы.INNER JOIN вернет запись с идентификатором датчика, которая доступна в обеих таблицах.Но если вы хотите просмотреть записи, по крайней мере, доступные в таблице 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
0 голосов
/ 17 июня 2019

использовать объединение всех, группировка по отметке времени.

код:

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. Вы также можете использовать union, Union удалит дублирующиеся строки.

  2. Объединение всех не удалит повторяющиеся строки.

-> использовать операторов (union или union all) в соответствии с требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...