none
Tirar média de um período de 10 minutos RRS feed

  • Pergunta

  • Boa tarde a todos. 

    Estou com um problema e não consigo pensar na lógica necessária para resolve-lo. 

    Tenho uma tabela no sql que coleta dados a cada 2 minutos. Tenho uma coluna dataInsercao do tipo datetime e uma coluna do tipo numeric. 

    Minha dúvida é, como calcular a média em um período de 10 minutos? Como coleto dados a cada dois minutos, seria uma média de cinco valores e exibir o campo datetime de 10 em 10 minutos, ficaria algo assim: 

    data10min                        /    campoCalc

    2019-02-19 10:00:00       /      5     

    2019-02-19 10:10:00       /      8     

    2019-02-19 10:20:00       /      12             

    A única lógica que pensei talvez seria pegar o caracter final do MINUTO, que seria 0 e calcular em cima disso, porém não obtive exito.

    Agradeco caso alguem possa ajudar.

    Obrigado.


    terça-feira, 19 de fevereiro de 2019 15:23

Respostas

  • Experimente alterar os trechos onde está:

        dateadd(minute, datediff(minute, 0, Data_Hora) / 10 * 10, 0)


    para

        dateadd
            (minute, 
             ceiling( (datediff(minute, 0, Data_Hora) + datepart(second, Data_Hora) / 60.0 + datepart(millisecond, Data_Hora) / 60000.0 ) / 10.0) * 10, 
             0)

    Dessa forma serão considerados até os milisegundos.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 19 de fevereiro de 2019 19:29
    • Marcado como Resposta Willian Alaguês terça-feira, 19 de fevereiro de 2019 21:06
    terça-feira, 19 de fevereiro de 2019 19:28

Todas as Respostas

  • Olá Willian Alaguês,

    A média que pretende obter é dos valores do seu campo numérico ou das horas? por que se eu entendi a tua questão, você querre que a cada 2 min um certo valor junto com a data e hora seja lançado no banco e a cada 10 min o sistema busque a média de tais valores certo? se é assim o simple é usar a função avg(Nome_do_Campo) para receber a média dos valores lançados e, pode botar esta execução em um timer programado a executar no intervalo de cada 10min. exemplo da query seria: SELECT AVG(Nome_Do_Campo) FROM Nome_Da_Tabela.

    Estero que te ajudou.

    terça-feira, 19 de fevereiro de 2019 16:02
  • Olá Timóteo, obrigado pela resposta. O que quero na verdade é a média do campo numérico. O que eu tenho hoje é uma tabela com dados a cada 2 minutos. O que quero fazer na verdade é "comprimir" esses valores, exibindo a tabela de 10 em 10 minutos. Para isso preciso da média desses valores a cada 10 minutos. 

    Já fiz uma certa vez, comprimindo esses valores de hora em hora, utilizando a função: dateadd(hour, datediff(hour, 0 ,dbo.Base.data_hora) , porém a cada 10 minutos não consegui fazer. 

    Obrigado pela a atenção.

    terça-feira, 19 de fevereiro de 2019 16:31
  • Willian,

    Utilize da mesma forma a função DateAdd em conjunto com a DateDiff, ao invês de informar o valor hour para os respectivos parâmetros, informe minutes ou m.

    Mas uma pergunta, você esta armazenamento este período de intervalos de valores de 10 em 10 minutos?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 19 de fevereiro de 2019 16:44
  • Obrigado Junior pela atenção. Referente a sua pergunta, minha tabela armazena os valores de 2 em 2 minutos, preciso apenas exibir de os valores de 10 em 10, porém preciso tirar a média desse periodo de 10 minutos. Como disse antes eu consegui fazer para exibir de hora em hora, tirando a média dessa hora com a seguinte query: 

    SELECT 
           dateadd(hour, datediff(hour, 0 ,Data_Hora),0) as data_hora
          ,AVG([Potência]) as potencia_hora      
      FROM tabela 
      GROUP BY dateadd(hour, datediff(hour, 0 ,Data_Hora),0)
      ORDER BY dateadd(hour, datediff(hour, 0 ,Data_Hora),0) 

    Tentei substituir o HOUR por MINUTE, porém acredito que tenho que alterar outro parametro, porém não encontro qual.


    terça-feira, 19 de fevereiro de 2019 17:08
  • Boa tarde,

    Willian, experimente fazer uns testes dessa forma:

    SELECT 
        dateadd(minute, datediff(minute, 0, Data_Hora) / 10 * 10, 0) as data_hora,
        AVG([Potência]) as potencia_hora      
    FROM tabela 
    GROUP BY 
        dateadd(minute, datediff(minute, 0, Data_Hora) / 10 * 10, 0)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Willian Alaguês terça-feira, 19 de fevereiro de 2019 17:29
    • Não Marcado como Resposta Willian Alaguês terça-feira, 19 de fevereiro de 2019 17:32
    terça-feira, 19 de fevereiro de 2019 17:18
  • Desculpa gapimex, encontrei apenas um probleminha, aqui.  

    A sua função calcula certinho a média do periodo, porem ela joga o resultado no periodo anterior. 

    exemplo: Os valores do periodo entre 7:00 ~ 7:10 ela joga o resultado em 7:00  /  Os valores do periodo entre 7:10 ~ 7:20 ela joga o resultado em 7:10 , teria que jogar em 7:20. Será que altero algo no dateadd? 

    Obrigado.

    terça-feira, 19 de fevereiro de 2019 17:35
  • Na verdade reparei que na minha função que calcula por hora, também ocorre isso. 
    terça-feira, 19 de fevereiro de 2019 17:40
  • Os segundos devem ser considerados? Se o horário for 7:10:01 deverá entrar na média das 7:20?

    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 19 de fevereiro de 2019 17:55
  • Isso mesmo gapimex.
    terça-feira, 19 de fevereiro de 2019 18:35
  • Experimente alterar os trechos onde está:

        dateadd(minute, datediff(minute, 0, Data_Hora) / 10 * 10, 0)


    para

        dateadd
            (minute, 
             ceiling( (datediff(minute, 0, Data_Hora) + datepart(second, Data_Hora) / 60.0 + datepart(millisecond, Data_Hora) / 60000.0 ) / 10.0) * 10, 
             0)

    Dessa forma serão considerados até os milisegundos.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 19 de fevereiro de 2019 19:29
    • Marcado como Resposta Willian Alaguês terça-feira, 19 de fevereiro de 2019 21:06
    terça-feira, 19 de fevereiro de 2019 19:28
  • Perfeito gapimex, agora funcionou corretamente, muito obrigado. 
    terça-feira, 19 de fevereiro de 2019 21:07
  • Isso mesmo José, com a solução anterior os dados que ficassem entra 0:00:00 e 0:10:00 eram exibidos em 0:00:00. Com a solução apresentada pelo gapimex, funcionou corretamente agora. Obrigado.
    terça-feira, 19 de fevereiro de 2019 21:09