Я зеленый, когда дело доходит до запросов 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 секунд, но когда происходит «событие», запускаются дополнительные данные для записи в оба.
Что мне нужно сделать, это;
- Поиск StringTable для «события», ища Val START или
СТОП.
- Найдя, используйте DateAndTime для извлечения данных из
FloatTable AND StringTable (включая «событие», найденное выше) за 10 секунд до и 10 секунд после события.
- Используйте 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