Calcular valores na mesma coluna com valor anterior

23/02/2024

0

Olá Pessoal,

Estou com um situação nessa consulta, venho pedir auxilio aqui no grupo para tentar resolver,
Nessa imagem apresenta os dados de uma consulta, porem preciso calcular a diferença de dias entre cada situação ou seja, na coluna Dias seria a diferença entre as datas dos campos Data e DtEmissao, agora preciso calcular a diferença entre os dias do Campo Dias, exemplo:
Numero| Dias | Diferenca_dias
554 7 null
554 12 (12-7) 5
554 23 (23-12) 11
554 23 (23-23) 0
590 8 Null
590 9 (9-8) 1
595 13 Null
Obs: para os valores Null poderia repedir os valores da coluna dias
⚠️ Outro detalhe: tentei utilizar a função LAG porem sem sucesso, pois nossa versão do banco é 2005 🫣

SELECT
D.Numero
,D.DtEmissao
,D.CodigoSituacao
,C.Descricao as Cargo
,Data
,INS.Descricao as Situação
,P.NomeUsual as Responsavel
,CASE WHEN ins.Descricao = 'Liberado' THEN
DATEDIFF(DAY,D.DtMovimento, ISL.Data)
WHEN ins.Descricao = 'Liberado' THEN
DATEDIFF(DAY,ISL.Data,ISL.Data)
ELSE DATEDIFF (day,D.DtEmissao,ISL.Data)
END as Dias
,null as Diferenca_Dias
--,LAG(ISL.Data,1) OVER (PARTITION BY D.Numero ORDER BY D.Numero, ISL.Data) as Numero_Dias
FROM
MotivoContratacaoCandidato MCC
LEFT JOIN RequisicaoCandidato RC
ON RC.OIDMotivoContratacaoCandidato = MCC.OIDMotivoContratacaoCandidato
LEFT JOIN RequisicaoCandidatoMov RCM
ON RC.OIDdocumento = RCM.OIDRequisicaoCandidatoMov
LEFT JOIN Documento D
on D.OIDdocumento = RC.OIDdocumento
LEFT JOIN Cargo C
ON C.OIDCargo = Rc.oidcargo

LEFT JOIN IndicativoSituacaoLog ISL
on D.OIDDocumento = ISL.OIDDocumento
LEFT JOIN IndicativoSituacao INS
on ins.OIDIndicativoSituacao = ISL.OIDIndicativoSituacao
LEFT JOIN Pessoa P
ON P.OIDPessoa = ISL.OIDResponsavel

WHERE YEAR(D.DtEmissao) = 2024 AND D.Numero in ('590','595','554','521')
Adriano Anacleto

Adriano Anacleto

Responder

Posts

23/02/2024

Arthur Heinrich

Você pode utilizar funções analíticas para isso.

A função lag(coluna) retorna o valor da coluna anterior e a função lead(coluna) retorna o valor da coluna na linha seguinte.

Porém, para que o banco saiba qual é a linha anterior ou posterior, você precisa indicar um critério de ordenação. No seu exemplo, não há uma coluna de valor sequencial que permita aplicar um order by.

Porém, vamos supor que esta análise tenha que ser feita separadamente para cada valor da coluna NUMERO e que a ordem pode ser estabelecida pela quantidade de dias.

Você pode fazer:

select
  numero,
  dias,
  dias - lag(dias) over(partition by numero order by dias) diferenca_dias
from
  (<subselect>) dados
order by numero, dias

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar