Array
(
)

Calcular média movel dos ultimos 30 dias

Patrick
   - 23 dez 2015

Galera, é o seguinte, tenho um problema e não consigo resolver, preciso calcular a média móvel e colocar em um gráfico através de uma query SQL, como
sabemos, a média movel é calculada atráves da soma dos valores naqueles dias e dividido pela quantidade de dias até aquela data, então vem a dúvida, como ficaria uma query assim, consigo fazer isso com uma query "seca" ou vou precisar de uma function, já que os calculos vão ser dinamicos, pois o calculo do dia 25 vai ser VALOR / 25 e o calculo do dia 03 vai ser VALOR / 03??

Obrigado a quem responder.

Isaac Jose
   - 23 dez 2015

boa tarde possuo um processo desse tipo.
Criei uma tabela contendo os feriados do ano e uma função que verifica os dias uteis essa função pega os dias e depois vc da um update em um campo de dias uteis e dai faz seu calculo. abaixo segue exemplos.
obs. não costumo postar códigos espero que esteja certo.

d#Código

create  function [manutencao].[Fn_Dias_Uteis] (@datainicio date ,@datafim date)
returns int 
as 
begin 
declare @count int
select @count  = 0 
while @datainicio <= @datafim
begin 
if datePart(weekday,@datainicio)not in (7,1) and @datainicio not in (select data_feriado from producao.tb_feriado)
select  @count = @count +1
select @datainicio  = dateadd(day,1,@datainicio)
end
return @count
Citação:
end GO


----#Código
update tabela_com_Dia
set  qtddiautil = (

select manutencao.fn_Dias_Uteis((select  DataInicio = CAST(MAX(BintAno)AS VARCHAR(4))+'-'+
					 CAST(MAX(tintmes)AS VARCHAR(2))+'-'+
					 '01'
        from producao.Tb_AcumProd_PFPJ_Dia)
        ,(SELECT
        
        DataFim    = CAST(MAX(BintAno)AS VARCHAR(4))+'-'+
					 CAST(MAX(tintmes)AS VARCHAR(2))+'-'+
					 CAST(MAX(tintdia)AS VARCHAR(2))
from tabela_com_Dia a
where  a.tintMes =(select (max(tintmes)) from tabela_com_Dia )

       )))

Patrick
   - 23 dez 2015


Citação:
boa tarde possuo um processo desse tipo.
Criei uma tabela contendo os feriados do ano e uma função que verifica os dias uteis essa função pega os dias e depois vc da um update em um campo de dias uteis e dai faz seu calculo. abaixo segue exemplos.
obs. não costumo postar códigos espero que esteja certo.

d#Código

create  function [manutencao].[Fn_Dias_Uteis] (@datainicio date ,@datafim date)
returns int 
as 
begin 
declare @count int
select @count  = 0 
while @datainicio <= @datafim
begin 
if datePart(weekday,@datainicio)not in (7,1) and @datainicio not in (select data_feriado from producao.tb_feriado)
select  @count = @count +1
select @datainicio  = dateadd(day,1,@datainicio)
end
return @count
Citação:
end GO


----#Código
update tabela_com_Dia
set  qtddiautil = (

select manutencao.fn_Dias_Uteis((select  DataInicio = CAST(MAX(BintAno)AS VARCHAR(4))+'-'+
					 CAST(MAX(tintmes)AS VARCHAR(2))+'-'+
					 '01'
        from producao.Tb_AcumProd_PFPJ_Dia)
        ,(SELECT
        
        DataFim    = CAST(MAX(BintAno)AS VARCHAR(4))+'-'+
					 CAST(MAX(tintmes)AS VARCHAR(2))+'-'+
					 CAST(MAX(tintdia)AS VARCHAR(2))
from tabela_com_Dia a
where  a.tintMes =(select (max(tintmes)) from tabela_com_Dia )

       )))


Olá Isaac, obrigado pela resposta, PORÉM ainda não é o que eu quero, eu quero saber o ultimo mês, os ultimos dois mesês. pois eu já tenho as datas, ou seja, as datas vão ser agrupadas e depois fazer a média movel...

Isaac Jose
   - 23 dez 2015

Amigo isso é adaptável é só criar uma tmp agrupando os valores e depois trabalhar com os meses que tem a informação. Mais a pergunta q vc fez não tem esse conteúdo da ultima resposta.PORÉM é só trabalhar com as funções de getdate, Max etc que chegara ao resultado se não conseguir mande uma estrutura com alguns inserts q tento fazer algo