SQL解决方案,用于实时计算增量值的总消耗量

问题描述 投票:0回答:2

我有一个SQL表,其中每秒具有增量值的列。我怎样才能确定一小时的变化或消耗值?

For e.g.
Date            Time                EnergyKWH
2019-02-16      18:00:00.000        43.366
2019-02-16      18:00:01.000        43.367
2019-02-16      18:00:02.000        43.369
.................
............
.........
2019-02-16      19:00:00.000        70.886

(每1秒1条记录,1小时3600条记录)

如何从18:00到19:00找到每小时的总消耗量,并分别计算所有24小时的总消耗量? (每小时消耗量将是18:00和19:00之间的差值)。

Expected Result :
Date            StartTime           EndTime             EnergyKWH
2019-02-16      18:00:00            19:00:00            27.250        (Difference of 70.886-43.366)
2019-02-16      19:00:00            20:00:00            21.561        (Next Value Approximation)

数据以每秒为基础进行实时生成,我需要一个可以自动完成此过程的解决方案。

我是否应该使用像View或CTE这样的东西进行实时计算,或者将带有计算结果的触发器转到另一个保存我所需结果集的表?

请记住,这将是所有日期和所有24小时的持续过程。理想情况下,我希望保留至少7天的计算/结果数据。我的数据库版本是MS SQL 2012。

我只需要在18:00和19:00的价值差异,同样的所有24小时,今天和过去的任何日期。

我可以用数学方法进行计算,它很容易,但是当新数据继续流入时,什么是自动化该过程的最佳方式?

sql sql-server-2012 common-table-expression database-trigger sql-view
2个回答
0
投票

如果你有所有数据没有间隙,那么这样的事情:

select t.date, t.time as starttime,
       lead(t.time) over (order by t.date, t.time) as endtime,
       (lead(EnergyKWH) over (order by t.date, t.time) -
        EnergyKWH
       ) as EnergyKWH_diff
from t
where extract(minute from time) = 0
order by t.date, t.time;

这使用ISO / ANSI标准功能。这些可能因数据库而异,但想法是一样的。

在SQL Server中,这将表示为:

select t.date, t.time as starttime,
       lead(t.time) over (order by t.date, t.time) as endtime,
       (lead(EnergyKWH) over (order by t.date, t.time) -
        EnergyKWH
       ) as EnergyKWH_diff
from t
where datepart(minute, time) = 0
order by t.date, t.time;

0
投票

好吧,所以我有一个可能的解决方案,但我不想这样做因为它非常粗糙而且很慢。

它在7天的数据中花费> 5秒,随着数据的扩展,这将继续增加。

创建视图或CTE有助于提供更好的性能吗?我知道我可以在View中添加一个额外的索引,但是因为我以递归方式访问该表而不是CTE(自联接将替换此嵌套查询)

示例解决方案查询

SELECT 
    (CASE WHEN ((DATEPART(Minute,p.[Time])) = 0 AND (DATEPART(SECOND,p.Time)) = 0)
                AND (DateAdd(HOUR,1, p.[Time])  IS NOT NULL)
        THEN 
             (Select -1 * (p.EnergyKWH - (Select EnergyKWH from FactPLCDetails p2 WHERE p2.[Time] = (DateAdd(HOUR,1, p.[Time])) AND p.[Date] = p2.[Date]) ))
        END
    )
    as [EnergyDiff],
    p.[Time] As Start_Time,
    (DateAdd(HOUR,1, p.[Time])) as End_Time,
    p.[Date]     
from FactPLCDetails p
ORDER BY [EnergyDiff] DESC
© www.soinside.com 2019 - 2024. All rights reserved.