Calcular valores na mesma coluna com valor anterior
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')
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
Curtidas 0
Respostas
Arthur Heinrich
23/02/2024
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:
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
GOSTEI 0