数据表是记录能耗的,能耗是个累加值,每分钟记录一下,希望可以查到每间隔一定时间(如5分钟)的差值,并对差值求和
创建表格
create table dataEnergy(
id int,
userid varchar(30),
data int,
rdate datetime
)
插入数据
insert into dataEnergy(id,userid,data,rdate) values(1,'1',1,'2021-04-26 16:01:00');
insert into dataEnergy(id,userid,data,rdate) values(2,'1',3,'2021-04-26 16:02:00');
insert into dataEnergy(id,userid,data,rdate) values(3,'1',5,'2021-04-26 16:03:00');
insert into dataEnergy(id,userid,data,rdate) values(4,'1',6,'2021-04-26 16:04:00');
insert into dataEnergy(id,userid,data,rdate) values(5,'1',7,'2021-04-26 16:05:00');
insert into dataEnergy(id,userid,data,rdate) values(6,'1',10,'2021-04-26 16:06:00');
insert into dataEnergy(id,userid,data,rdate) values(7,'1',13,'2021-04-26 16:08:00');
insert into dataEnergy(id,userid,data,rdate) values(8,'1',16,'2021-04-26 16:09:00');
insert into dataEnergy(id,userid,data,rdate) values(9,'1',17,'2021-04-26 16:10:00');
insert into dataEnergy(id,userid,data,rdate) values(10,'1',18,'2021-04-26 16:11:00');
insert into dataEnergy(id,userid,data,rdate) values(11,'1',20,'2021-04-26 16:15:00');
insert into dataEnergy(id,userid,data,rdate) values(12,'1',22,'2021-04-26 16:16:00');
insert into dataEnergy(id,userid,data,rdate) values(13,'1',24,'2021-04-27 16:01:00');
insert into dataEnergy(id,userid,data,rdate) values(14,'1',26,'2021-04-27 16:02:00');
insert into dataEnergy(id,userid,data,rdate) values(15,'1',28,'2021-04-27 16:03:00');
insert into dataEnergy(id,userid,data,rdate) values(16,'1',33,'2021-04-27 16:04:00');
insert into dataEnergy(id,userid,data,rdate) values(17,'1',35,'2021-04-27 16:05:00');
insert into dataEnergy(id,userid,data,rdate) values(18,'1',37,'2021-04-27 16:06:00');
insert into dataEnergy(id,userid,data,rdate) values(19,'1',38,'2021-04-27 16:56:00');
insert into dataEnergy(id,userid,data,rdate) values(20,'1',41,'2021-04-27 16:58:00');
insert into dataEnergy(id,userid,data,rdate) values(21,'1',43,'2021-04-27 17:00:00');
insert into dataEnergy(id,userid,data,rdate) values(22,'1',46,'2021-04-27 17:01:00');
insert into dataEnergy(id,userid,data,rdate) values(23,'1',48,'2021-04-27 17:02:00');
insert into dataEnergy(id,userid,data,rdate) values(24,'1',51,'2021-04-27 17:03:00');
insert into dataEnergy(id,userid,data,rdate) values(25,'1',53,'2021-04-27 17:04:00');
insert into dataEnergy(id,userid,data,rdate) values(26,'1',55,'2021-04-27 17:05:00');
insert into dataEnergy(id,userid,data,rdate) values(27,'1',57,'2021-04-27 17:06:00');
insert into dataEnergy(id,userid,data,rdate) values(28,'1',60,'2021-04-27 17:07:00');
修改了查询。当数据缺失时找上一条记录。
WITH FiveMiniteEnergy AS
(
SELECT *,
(
SELECT TOP 1 FiveMinuteAgo.data
FROM dataEnergy As FiveMinuteAgo
WHERE FiveMinuteAgo.rdate <= DATEADD(MINUTE, -5, dataEnergy.rdate)
ORDER BY FiveMinuteAgo.rdate DESC
) AS FiveMinuteAgoData
FROM dataEnergy
WHERE DATEPART(MINUTE, dataEnergy.rdate) % 5 = 0
)
SELECT id,
rdate,
data,
FiveMinuteAgoData,
data - COALESCE(FiveMinuteAgoData, 0) AS EnergyConsumption
FROM FiveMiniteEnergy
ORDER BY rdate
;
// Output
id rdate data FiveMinuteAgoData EnergyConsumption
5 2021-04-26 16:05:00.000 7 NULL 7
9 2021-04-26 16:10:00.000 17 7 10
11 2021-04-26 16:15:00.000 20 17 3
17 2021-04-27 16:05:00.000 35 22 13
21 2021-04-27 17:00:00.000 43 37 6
26 2021-04-27 17:05:00.000 55 43 12
select sum(data) from dataEnergy;
写了一个查询。我假设了每分钟有数据。但是其实有的分钟数据缺了。还在想怎么弥补。
WITH FiveMiniteEnergy AS
(
SELECT *, DATEPART(MINUTE, rdate) AS minute
FROM dataEnergy
WHERE DATEPART(MINUTE, rdate) % 5 = 0
)
SELECT FiveMiniteEnergy.id,
FiveMiniteEnergy.rdate,
FiveMiniteEnergy.data,
FiveMinuteAgo.data AS FiveMinuteAgoData,
FiveMiniteEnergy.data - COALESCE(FiveMinuteAgo.data, 0) AS EnergyConsumption
FROM FiveMiniteEnergy
LEFT OUTER JOIN FiveMiniteEnergy AS FiveMinuteAgo
ON FiveMiniteEnergy.rdate = DATEADD(MINUTE, 5, FiveMinuteAgo.rdate)
ORDER BY FiveMiniteEnergy.rdate
;
// Output
id rdate data FiveMinuteAgoData EnergyConsumption
5 2021-04-26 16:05:00.000 7 NULL 7
9 2021-04-26 16:10:00.000 17 7 10
11 2021-04-26 16:15:00.000 20 17 3
17 2021-04-27 16:05:00.000 35 NULL 35
21 2021-04-27 17:00:00.000 43 NULL 43
26 2021-04-27 17:05:00.000 55 43 12
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y