首页 > 解决方案 > 有条件地从一张表中汇总一列中一组的值

问题描述

我有一个表,它将测量值记录到 [Value] 列中,其中 [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

仅当值更改时才记录值。我想做的是;当 CT 值大于 600 且 FT 值大于 10 时,我想对 FT 值进行累加。我知道如何使用 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

标签: sql-server-2012

解决方案


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

我还假设您想按天分组。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 子句(with AND

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

推荐阅读