我有一个表,该表将测量值记录到[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'
答案 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)