有条件地从一张表中汇总一列中一组的值

时间:2019-02-22 19:11:33

标签: sql-server-2012

我有一个表,该表将测量值记录到[Value]列中,其中[DateTime]列用于时间戳,[TagName]列用于显示测量值。您可以在下面的示例部分中看到它。

FF C0

仅在更改值时记录值。 我想做的是我想在CT值大于600且FT值大于10时对FT值求和。我知道如何使用LAG方法求和,但不知道如何过滤我提到的条件。

我尝试过类似的事情:

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

预期输出:

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'

1 个答案:

答案 0 :(得分:0)

每当您想要将同一张表的两个不同记录相互关联时,必须通过提供两个不同的别名并将它们连接在一起来从同一张表中选择两次。

我还假设您要按天分组。 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)