Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dino César Vitória

[Resolvido] Comparando Registros

Recommended Posts

Bom dia pessoal.

 

Tenho uma dúvida aqui no melhor método a fazer e como fazer; vou explicar o que quero.

 

Possuo uma tabela com os seguinte campos e valores:

codigo_produto  peso   data_hora
343222          2,3    08/02/2011 17:24:22
434221          2,8    08/02/2011 17:24:30

O que eu gostaria de saber seria a diferença entre o registro atual e o anterior, no campo data_hora, ficando assim:

 

codigo_produto  peso   data_hora             diferenca
343222          2,3    08/02/2011 17:24:22   0
434221          2,8    08/02/2011 17:24:30   00:00:07

Fazendo isso para os registros restantes, sempre comparando o registro atual com o anterior.

 

Desculpem, mas sou iniciante, então terei algumas dúvidas quanto a execução de certos processos; mas desde já agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que serviria algo do tipo?

 

select a.codigo_produto,
      a.peso,
      a.data_hora
 datediff(ss, (SELECT TOP 1 b.data_hora from SUA_TABELA b where a.codigo_produto < b.codigo_produto), a.data_hora)
 from SUA_TABELA a
order by a.codigo_produto

 

Abcs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

outra possível solução, comparando dias e horas:

 

inserindo dados para teste

set dateformat dmy
declare @table table (codigo_produto int, peso decimal(10,2), data_hora datetime)
insert into @table (codigo_produto, peso, data_hora) 
values (343222,2.3,'08/02/2011 17:24:22')
insert into @table (codigo_produto, peso, data_hora) 
values (434221,2.8,'08/02/2011 17:24:30')
insert into @table (codigo_produto, peso, data_hora) 
values (500000,5.1,'09/02/2011 00:30:00')
insert into @table (codigo_produto, peso, data_hora) 
values (500001,2.1,'09/02/2011 01:30:00')
insert into @table (codigo_produto, peso, data_hora) 
values (500002,4.1,'11/02/2011 02:00:00')
insert into @table (codigo_produto, peso, data_hora) 
values (500003,4.1,'11/02/2011 05:35:00')

query:

SELECT (SELECT Count(*) FROM @table t2 WHERE t1.codigo_produto >= t2.codigo_produto) as contador
,convert(varchar,datediff(dd, '1900-01-01 00:00:00.000',(SELECT top 1 t1.data_hora - t2.data_hora FROM @table t2 WHERE t1.codigo_produto > t2.codigo_produto order by codigo_produto desc))) + ' dias '+
convert(char(8),(SELECT top 1 t1.data_hora - t2.data_hora FROM @table t2 WHERE t1.codigo_produto > t2.codigo_produto order by codigo_produto desc),114) + ' horas' as Diferenca 
, * 
--, (SELECT top 1 convert(varchar,t1.data_hora) + ' - ' + convert(varchar,t2.data_hora) FROM @table t2 WHERE t1.codigo_produto > t2.codigo_produto order by codigo_produto desc)
FROM @table t1 ORDER BY t1.codigo_produto

retorna:

contador    Diferenca              codigo_produto peso        data_hora
----------- ---------------------- -------------- --------------------------------------- 
1           NULL                   343222         2.30        2011-02-08 17:24:22.000
2           0 dias 00:00:08 horas  434221         2.80        2011-02-08 17:24:30.000
3           0 dias 07:05:30 horas  500000         5.10        2011-02-09 00:30:00.000
4           0 dias 01:00:00 horas  500001         2.10        2011-02-09 01:30:00.000
5           2 dias 00:30:00 horas  500002         4.10        2011-02-11 02:00:00.000
6           0 dias 03:35:00 horas  500003         4.10        2011-02-11 05:35:00.000

(6 row(s) affected)

 

Obs.: para utilizar essa solução, o campo codigo_produto não pode se repetir

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que serviria algo do tipo?

 

select a.codigo_produto,
      a.peso,
      a.data_hora
 datediff(ss, (SELECT TOP 1 b.data_hora from SUA_TABELA b where a.codigo_produto < b.codigo_produto), a.data_hora)
 from SUA_TABELA a
order by a.codigo_produto

 

Abcs,

 

Obrigado Felipe, por incrível que pareça, eu já estava fazendo essa solução que veio "do além" rsrsr.

 

Mas agora fica uma outra dúvida: outros relacionamentos que eu tenho. Vou colocar aqui o script SQL:

 


select

 etq.cod_etiqueta,
 mpr.pes_produto_liquido,
 etq.dat_criacao,
 isnull((select top 1 eti.dat_criacao from
                                        abfsetq1 eti
                                      where
                                        eti.dat_criacao  > etq.dat_criacao and
                                        eti.cod_mapa     = etq.cod_mapa    and
                                        eti.cod_produto  = etq.cod_produto and
                                        eti.cod_operador = etq.cod_operador
                                       order by eqt.dat_criacao asc      ),etq.dat_criacao) anterior,
 datediff (ss, etq.dat_criacao, isnull((select top 1 eti.dat_criacao from
                                        abfsetq1 eti
                                      where
                                        eti.dat_criacao  > etq.dat_criacao and
                                        eti.cod_mapa     = etq.cod_mapa    and
                                        eti.cod_produto  = etq.cod_produto and
                                        eti.cod_operador = etq.cod_operador
                                       order by eqt.dat_criacao asc      ),etq.dat_criacao)) diferenca

from
 abfsetq1 etq, abfsmpr1 mpr

where
 mpr.cod_mov_producao    = etq.cod_mov_producao and
 mpr.cod_mov_turno       = etq.cod_mov_turno    and
 mpr.cod_operador        = etq.cod_operador     and
 mpr.cod_filial          = etq.cod_filial       and
 mpr.cod_empresa         = etq.cod_empresa      and
 etq.cod_mapa            = :cod_mapa            and
 etq.cod_produto         = :cod_produto         and
[color="#FF0000"][b]  mpr.pes_produto_liquido = :pes_produto_liquido and[/b][/color]
 etq.cod_operador        = :cod_operador

order by
 etq.dat_criacao asc

 

Como podem ver, a parte em vermelho está acabando comigo, pois sempre que referencio a outra tabela acima (a abfsmpr1), dá um erro:

The multi-part identifier "eqt.dat_criacao" could not be bound.

 

Isso acontece quando faço o seguinte:

 


select

 etq.cod_etiqueta,
 mpr.pes_produto_liquido,
 etq.dat_criacao,
 isnull((select top 1 eti.dat_criacao from
                                        abfsetq1 eti, abfsmpr1 mpo
                                      where
                                        eti.dat_criacao  > etq.dat_criacao and
                                        eti.cod_mapa     = etq.cod_mapa    and
                                        eti.cod_produto  = etq.cod_produto and
                                        eti.cod_operador = etq.cod_operador and
[color="#FF0000"]  mpo.cod_mov_producao    = etq.cod_mov_producao and
 mpo.cod_mov_turno       = etq.cod_mov_turno    and
 mpo.cod_operador        = etq.cod_operador     and
 mpo.cod_filial          = etq.cod_filial       and
 mpo.cod_empresa         = etq.cod_empresa      [/color]                               

                                      order by eqt.dat_criacao asc),etq.dat_criacao) anterior,
 datediff (ss, etq.dat_criacao, isnull((select top 1 eti.dat_criacao from
                                        abfsetq1 eti, abfsmpr1 mpo
                                      where
                                        eti.dat_criacao  > etq.dat_criacao and
                                        eti.cod_mapa     = etq.cod_mapa    and
                                        eti.cod_produto  = etq.cod_produto and
                                        eti.cod_operador = etq.cod_operador and
[color="#FF0000"]  mpo.cod_mov_producao    = etq.cod_mov_producao and
 mpo.cod_mov_turno       = etq.cod_mov_turno    and
 mpo.cod_operador        = etq.cod_operador     and
 mpo.cod_filial          = etq.cod_filial       and
 mpo.cod_empresa         = etq.cod_empresa    [/color]
                                      order by eqt.dat_criacao asc),etq.dat_criacao)) diferenca

from
 abfsetq1 etq, abfsmpr1 mpr

where
 mpr.cod_mov_producao    = etq.cod_mov_producao and
 mpr.cod_mov_turno       = etq.cod_mov_turno    and
 mpr.cod_operador        = etq.cod_operador     and
 mpr.cod_filial          = etq.cod_filial       and
 mpr.cod_empresa         = etq.cod_empresa      and
 etq.cod_mapa            = '39/2011'            and
 etq.cod_produto         = '808080'             and
 mpr.pes_produto_liquido = 19.990 and
 etq.cod_operador        = '2'

order by
 etq.dat_criacao asc

 

 

Pois preciso pegar o peso líquido, que é um filtro também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Moderador, pode fechar, consegui resolver queimando alguns neurônios rsrs.

 

 

Dino, seria interessante postar como conseguiu resolver. Vai que alguém tenha o mesmo problema :P

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.