Суммируйте значения одной группы в одном столбце условно из одной таблицы - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица, в которой записаны измеренные значения в столбец [Значение] со столбцом [DateTime] для отметки времени и столбцом [TagName], чтобы показать, какое это измерение.Ниже вы можете увидеть пример его части.

DateTime                    TagName             Value
2019-02-16 17:04:19.5550000 CT027001_01.OUT_PV  520.254638671875
2019-02-16 17:04:19.5550000 FT027001_01.OUT_PV  29.6527767181396
2019-02-16 17:04:20.7270000 CT027001_01.OUT_PV  517.07177734375
2019-02-16 17:04:20.7270000 FT027001_01.OUT_PV  29.4444446563721
2019-02-16 17:04:22.0860000 CT027001_01.OUT_PV  516.203674316406
2019-02-16 17:04:22.0860000 FT027001_01.OUT_PV  29.2013893127441
2019-02-16 17:04:23.0910000 CT027001_01.OUT_PV  515.914367675781
2019-02-16 17:04:23.0910000 FT027001_01.OUT_PV  29.0451393127441
2019-02-16 17:04:23.4770000 CT027001_01.OUT_PV  515.914367675781
2019-02-16 17:04:23.4770000 FT027001_01.OUT_PV  29.0451393127441
2019-02-16 17:04:24.4820000 CT027001_01.OUT_PV  516.782409667969
2019-02-16 17:04:24.4820000 FT027001_01.OUT_PV  28.4461803436279
2019-02-16 17:04:25.0860000 CT027001_01.OUT_PV  516.782409667969
2019-02-16 17:04:25.0860000 FT027001_01.OUT_PV  28.4461803436279

Значения записываются только при изменении значения.То, что я хочу сделать, это;Я хочу суммировать значения FT, когда значения CT больше 600 и значения FT больше 10. Я знаю, как суммировать значения с использованием метода LAG, но я не знаю, как фильтровать условия, которые я упомянул.

Я пробовал что-то вроде:

SELECT C.[DateTime], C.[TagName], C.[Value] FROM (
 SELECT [DateTime]
  ,[TagName]
  ,[Value]
 FROM [Runtime].[dbo].[History] 
 where TagName like '%CT027001%' and TagName= 'FT027001_01.OUT_PV' 
       AND [DateTime] > '2019-02-16' AND [DateTime] < '2019-02-17') C 
        WHERE C.[Value] > 10 AND C.[TagName] = 'FT027001_01.OUT_PV'

Ожидаемый результат:

TotalFlow 1500.0000

1 Ответ

0 голосов
/ 22 февраля 2019

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

Я также предполагаю, что вы хотитегруппа днем.CONVERT(date, FT.DateTime) убирает часть времени.

SELECT CONVERT(date, FT.DateTime) AS DateTime, FT.TagName, SUM(FT.Value) AS Total
FROM
    History FT
    INNER JOIN History CT
        ON FT.DateTime = CT.DateTime
WHERE
    FT.TagName LIKE 'FT%' AND
    CT.TagName LIKE 'CT%' AND
    CT.Value > 600 AND
    FT.Value > 10
GROUP BY
    CONVERT(date, FT.DateTime),
    FT.TagName

Если DateTime недостаточно точен для сопряжения двух записей, вы также можете добавить это условие в предложение where (с AND)

SUBSTRING(FT.TagName, 3, 100) = SUBSTRING(CT.TagName, 3, 100)
...