Neste artigo, mostraremos como obter as médias dos campos de uma tabela do banco de dados SQL Server em três diferentes bases de tempo (minuto, hora e dia). Para tal, é necessário isolar os valores do campo de DataHora – E3TimeStamp – na base de tempo desejada, e agrupar os dados utilizando esta mesma base de tempo. Isto é, para fazer uma média de valores agrupados por minuto, é necessário manipular o E3TimeStamp de tal forma que qualquer informação menor que o minuto seja omitida (neste caso, informações referente aos segundos e milissegundos). Isto pode ser feito utilizando-se o comando CAST, que tem a função de converter tipos de dados, e realizando alguns cálculos. No momento destes cálculos, deve-se levar em consideração que uma unidade neste valor de data equivale a um dia. Para calcular a média, pode-se usar o comando AVG.
– Médias por minuto: para obter as médias por minuto, é necessário obter os segundos e milissegundos do E3TimeStamp. Para tal, deve-se multiplicar este campo por 24 (para converter a base de tempo para horas), e depois por 60 (para convertê-la para minutos). O resultado deve ser manipulado para isolar a parte inteira, que corresponderá aos minutos. Por fim, deve-se dividir tudo pelo mesmo valor (1440 = 24 x 60) para que o dado seja convertido novamente para o formato data. O resultado destes cálculos será utilizado para agrupar os dados.
SELECT CAST(CAST(CAST(CAST(E3TimeStamp as float)*1440 as bigint) as float)/1440 as datetime) as Minuto, AVG(Campo) as Média
FROM Tabela
GROUP BY CAST(CAST(CAST(CAST(E3TimeStamp as float)*1440 as bigint) as float)/1440 as datetime)
– Médias por hora:
SELECT CAST(CAST(CAST(CAST(E3TimeStamp as float)*24 as bigint) as float)/24 as datetime) as Hora, AVG(Campo) as Média
FROM Tabela
GROUP BY CAST(CAST(CAST(CAST(E3TimeStamp as float)*24 as bigint) as float)/24 as datetime)
ORDER BY CAST(CAST(CAST(CAST(E3TimeStamp as float)*24 as bigint) as float)/24 as datetime)
– Médias por dia:
SELECT CAST(FLOOR(CAST(E3TimeStamp as float)) as datetime) as Dia, AVG(Campo) as Média
FROM Tabela
GROUP BY CAST(FLOOR(CAST(E3TimeStamp as float)) as datetime)
É possível inserir um filtro utilizando o E3TimeStamp nesta consulta?
Olá Romulo,
Sim, basta inserir duas variáveis para realizar o filtro por data.
Por exemplo:
SELECT CAST(FLOOR(CAST(E3TimeStamp as float)) as datetime) as Dia, AVG(Campo) as Média
FROM Tabela
WHERE ( Tabela.E3TimeStamp > #<%DataIni%># AND Tabela.E3TimeStamp < #<%DataFim%># )
GROUP BY CAST(FLOOR(CAST(E3TimeStamp as float)) as datetime)
Para setar as variáveis em runtime, utilize o método SetVariableValue.
Boa noite,
Tenho uma base de dados que armazena informações a cada 9 segundos. Preciso da média de cada hora, como montar um script para esse propósito?
Olá Eliziario,
Não é necessário criar um script para realizar a média de cada hora, basta utilizar a sintaxe do item Médias por hora deste artigo em um objeto consulta:
Outra alternativa seria utilizar os recursos do próprio Relatório para calcular a média, conforme o artigo https://kb.elipse.com.br/kb37429-agrupando-dados-no-relatorio/.
Para agrupar por hora, utilizar no DataField a expressão ‘=Hour(E3TimeStamp)’.
Boa tarde, estou tentando implementar este código para que me apresente a média a cada 15 minutos, poderia me dizer como ficara?