SQL-запрос - Найти значение и получить данные из других таблиц одновременно - PullRequest
0 голосов
/ 29 октября 2018

Я зеленый, когда дело доходит до запросов SQL. Очень зеленый.

У меня есть 3 таблицы. Сначала dbo.StringTable поддерживает таблицу переменных, в которой в качестве данных используются строки.

DateAndTime               TagIndex     Val  
2018-10-28 11:48:12.000   42           on load      
2018-10-28 11:48:12.000   43           on load      
2018-10-28 11:48:12.000   44           START        
2018-10-28 11:48:12.000   45           on load      
2018-10-28 11:48:12.000   46           on load      

Аналогично, в dbo.FloatTable есть теги с плавающими значениями;

DateAndTime               TagIndex     Val  
2018-10-28 11:48:12.000   47           33.4     
2018-10-28 11:48:12.000   48           42.3     
2018-10-28 11:48:17.000   47           16.3
2018-10-28 11:48:17.000   48           18.0     
2018-10-28 11:48:22.000   47           52.1     

Третий (dbo.TabTable) имеет статическое отображение между TagIndex и TagName

TagName                   TagIndex  
gtg_evnt\4                45    
gtg_evnt\5                46    
plc\system\capacity\1     47    
plc\system\load\1         48    
plc\system\req_load\1     49    

Данные регистрируются как в FloatTable, так и в StringTable каждые 5 секунд, но когда происходит «событие», запускаются дополнительные данные для записи в оба.

Что мне нужно сделать, это;

  1. Поиск StringTable для «события», ища Val START или СТОП.
  2. Найдя, используйте DateAndTime для извлечения данных из FloatTable AND StringTable (включая «событие», найденное выше) за 10 секунд до и 10 секунд после события.
  3. Используйте TagTable, чтобы изменить TagIndex на правильное имя.

Этот тип запроса находится вне моей лиги. Я потратил 3 часа на чтение команд SQL и добился определенного прогресса, но это может занять у меня часы / дни, когда я почти уверен, что один из вас, ребята, решит эту проблему за несколько минут ...

Основываясь на ответе ниже, я сделал следующее. И после того, как я сделал это, я поработал над тем, что делает каждая часть, - в этом гораздо больше смысла.

Я обновил его, основываясь на своем последнем запросе, и добавил несколько комментариев в надежде, что это кому-нибудь поможет.

SELECT
    B.DateandTime 
   ,D.TagName
   ,B.Val

/** First, make a derived table 'A' with all the GTG Events in the past 1 day **/
FROM
  ( SELECT DateAndTime
          ,TagIndex
          ,Val 
    FROM [FTViewDatalog].[dbo].StringTable
    WHERE val in ('Start','Stop') AND
           DateAndTime >= GETDATE()-1
    ) A

/** The UNION creates a big table with StringTable and FloatTable merged together **/
/** The INNER JOIN then takes each of the DateAndTime from A, and gets the events from 10 seconds before and 10 seconds after **/
INNER JOIN
  ( SELECT DateAndTime
          ,TagIndex
          ,Val 
    FROM [FTViewDatalog].[dbo].StringTable
    UNION
    SELECT DateAndTime
          ,TagIndex
          ,Cast(Val AS varchar(50)) AS Val 
    FROM [FTViewDatalog].[dbo].FloatTable
    ) B
    ON B.DateAndTime BETWEEN DATEADD(ss,-10,A.DateAndTime ) AND  DATEADD(ss,10,A.DateAndTime )

/** Use an INNER JOIN to 'convert' the TagIndex into a TagName **/
INNER JOIN [FTViewDatalog].[dbo].TagTable D ON D.TagIndex=B.TagIndex

/** Use this if you want to filter out specific tags **/
/** WHERE D.TagName IN ('plc\system\req_load\1','plc\system\load\1', 'plc\system\capacity\1') OR D.TagName LIKE 'gtg_evnt\[1-7]' **/

/** Sort by date **/
ORDER BY B.DateAndTime ASC

1 Ответ

0 голосов
/ 29 октября 2018

Это поможет вам, не стесняйтесь, сообщить мне о любой проблеме,

Select C.TagName as OriginalEventName,A.DateandTime as OriginalEventTimeStamp,D.TagName as ParallelEventName,B.DateandTime as ParallelEventTimeStamp
from
(Select Cast(DateAndTime as datetime) as DateAndTime,Tagindex,cast(Val as Varchar(50)) as Val from StringTable
where val in ('Start','Stop'))A
inner join Tabtable C on C.Tagindex=A.TagIndex
Inner join
(Select Cast(DateAndTime as datetime) as DateAndTime,Tagindex,cast(Val as Varchar(50)) as Val from StringTable
Union
Select cast(DateAndTime as datetime) as DateAndTime,Tagindex,cast(Val as Varchar(50)) as Val FloatTable)B
on B.DateAndTime between DATEADD(ss,-10,A.DateAndTime ) and DATEADD(ss,10,A.DateAndTime )
inner join Tabtable D on D.Tagindex=B.TagIndex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...