Решение SQL для расчета агрегированного потребления из дополнительных значений в режиме реального времени - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть таблица 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 секунду, 3600 за 1 час)

Как узнать общее потребление за часбазис, с 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)

Данные поступают в режиме реального времени в секунду, и мне нужно решение, которое могло бы автоматизировать этот процесс,

Должен ли я использовать что-то вроде представления или CTE для вычисления на лету или, может быть, триггер с вычисленными результатами, идущий в другую таблицу с моим требуемым набором результатов?

Пожалуйста, имейте в виду, что это будет непрерывный процесс для всех дат и всех 24 часов.В идеале я хотел бы хранить как минимум 7 дней вычисленных данных / результатов.Моя версия БД - MS SQL 2012.

Мне просто нужна разница в значении в 18:00 и 19:00, и аналогично для всех 24 часов, на сегодняшний день и на любую дату в прошлом.

Я могу сделать этот расчет математически, это очень просто, но каков будет оптимальный способ автоматизировать этот процесс, когда поступают новые данные?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Хорошо, у меня есть возможное решение, но я не хочу идти с этим, потому что оно очень грубое и очень медленное.

Это занимает> 5 секунд для данных за 7 дней, это будет продолжатьсяувеличивается по мере расширения данных.

Поможет ли создание представления или CTE повысить производительность?Я знаю, что мог бы добавить дополнительный индекс в View, но не лучше CTE, так как я рекурсивно нажимаю на таблицу (Self join заменит этот вложенный запрос)

Пример запроса решения:

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
0 голосов
/ 27 февраля 2019

Если у вас есть все данные без пропусков, то что-то вроде этого:

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;
...