Ir para conteúdo

POWERED BY:

Arquivado

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

Andressito

Como filtrar esses dados?

Recommended Posts

Olá a todos!

 

Eu estou usando SQL pra filtrar alguns dados que recebo em excel.

Normalmente eu consigo fazer o que preciso, e as poucas coisas que não dá eu faço na mão.

Mas as vezes aparecem consultas com mais de 5000 registros e não dá pra fazer manualmente.

A verdade é que os dados que recebo tem alguns problemas e isso não posso mudar, então quero ver se há uma forma de contornar isso.

 

Esse é um exemplo dos dados que recebo (na verdade existem outros campos que não me interessam, e por isso alguns ficam duplicados):

 

cod  data        hora      idA   idB   t
1    01/12/2009  07:02:10  2789  4146  149 
2    01/12/2009  07:02:10  2789  4146  150 
3    01/12/2009  07:02:10  2789  4146  150 
4    01/12/2009  07:39:35  2789  4146  67 
5    01/12/2009  07:39:36  2789  4146  67 
6    01/12/2009  08:57:50  2789  4146  3902 
7    01/12/2009  08:57:50  2789  4146  3902 
8    01/12/2009  08:57:51  2789  4146  3902 
9    01/12/2009  10:56:24  4146  2789  0 
10   01/12/2009  10:56:24  4146  2789  1 
11   01/12/2009  11:08:45  2789  4146  105 
12   01/12/2009  12:12:45  2789  7354  262

 

os registros 1,2 e 3 se referem à mesma transação, assim como: (4,5) (6,7,8) e (9,10)

usar um SELECT DISTINCT elimina uma parte dos registros (3,7 e 8), mas ainda sobra muita coisa pra limpar (pelo menos quando eu tenho 5000 registros =P).

 

Eu precisava de uma consulta que retornasse:

 

cod  data        hora      idA   idB   t
2    01/12/2009  07:02:10  2789  4146  150 
4    01/12/2009  07:39:36  2789  4146  67 
6    01/12/2009  08:57:50  2789  4146  3902 
9    01/12/2009  10:56:24  4146  2789  1 
11   01/12/2009  11:08:45  2789  4146  105 
12   01/12/2009  12:12:45  2789  7354  262

 

Ou seja, no caso de registros similares, mas que se referem à mesma transação, considerar o que tem o maior tempo ou a hora

É possível fazer algo assim só com SQL ou é mais fácil eu jogar para um arquivo de texto e fazer um parser pra filtrar esses dados?

Ou existe uma outra possibilidade?

 

OBS: Eu acabei de checar e não existe nenhum campo que tenha o mesmo valor para designar a mesma transação... é somente vendo esses dados mesmo.

 

Agradeço qualquer sugestão!

Compartilhar este post


Link para o post
Compartilhar em outros sites

já tentou fazer com um MAX na data agrupando por transacao?

 

Tem modos mais corretos para se fazer, mas consegui pensar somente nisso

 

declare @table table (cod int, data datetime, idA int, idB int,t int)
declare @table_reference table (t int, data datetime)
insert into @table values (1,'01/12/2009 07:02:10',2789,4146,149)
insert into @table values (2,' 01/12/2009 07:02:10',2789,4146,150)
insert into @table values (3,' 01/12/2009 07:02:10',2789,4146,150)
insert into @table values (4,' 01/12/2009 07:39:35',2789,4146,67)
insert into @table values (5,' 01/12/2009 07:39:36',2789,4146,67)
insert into @table values (6,' 01/12/2009 08:57:50',2789,4146,3902)
insert into @table values (7,' 01/12/2009 08:57:50',2789,4146,3902)
insert into @table values (8,' 01/12/2009 08:57:51',2789,4146,3902)
insert into @table values (9,' 01/12/2009 10:56:24',4146,2789,0)
insert into @table values (10,'01/12/2009 10:56:24',4146,2789,1)
insert into @table values (11,'01/12/2009 11:08:45',2789,4146,105)
insert into @table values (12,'01/12/2009 12:12:45',2789,7354,262)


insert into @table_reference 
select t, max(data) from @table group by t

SELECT * from @table_reference 

select t.* from @table t inner join @table_reference tr on t.t = tr.t and t.data = tr.data

 

Antes que me crucifiquem, foi oque consegui fazer em 5 minutos no meu ambiente :hehehe: :P

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Andressito.

 

Como voce define que 2 ou mais registros são da mesma transação,pelo o que eu percebi,

hora voce usa coluna data como referencia, hora usa coluna 't' ou voce usa outra coluna que não esta no exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@supernoi

 

Na verdade, é no olho, considerando a data, hora e o tempo(t) que é a duração.

Isso que dificulta, mas usando a ideia do A.Jr, já melhorou bastante!

 

@A.Jr

 

Muito boa a ideia do MAX! Antes de você postar seu teste, eu tentei, e deu razoavelmente certo:

 

SELECT data, hora2, idA, idmB, MAX(t)
FROM ( SELECT data, MAX(hora) as hora2, idA, idB, t 
      FROM [Plan1$] 
      GROUP BY data, idA, idB, t) c1 
GROUP BY data, hora2, idA, idB 
ORDER BY data, hora2 

 

Só não digo ainda que está 100% porque não sei se deixou de considerar algum registro que deveria, e porque ele ainda pega obviamente registros que tem diferença na hora e no tempo(t), mas são da mesma transação.

 

Mas isso acho que tem que ser no manual mesmo... ou fazer um parser pra verificar se a hora ainda está no perído hora+t do registro anterior.

Ou dá pra fazer só no SQL?

 

Só pra dar uma ideia:

Arquivo original: 5388 registros

Com DISTINCT: 3372

Com Nested SELECT + MAX + GROUP BY: 2351

 

Só falta agora limpar esse último caso!

 

Por enquanto, muito obrigado!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que ajudei um pouco, mas fiquei com uma duvida com relacao aos campos cara.

 

o tampo t é tempo ou a transação? Pq não usa o max na data tambem?

 

hoje eu não vou poder te ajudar muito, pois estou com uns problemas no trampo para resolver (homologação de projeto que deu errado ¬¬) entao minha sexta vai ser daquele jeito, mas vai postando o andamento ai pra gente :P

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

@A.Jr

 

Ajudou muito! As vezes uma ideia que vem de fora resolve todo o problema =)

Fora que essa abordagem de MAX + GROUP BY deve me ajudar a resolver outras coisas!

 

O campo 't' é o tempo de duração.

A data não muda nos registros que se referem a mesma transação, somente a hora e o tempo 't', então não vi necessidade de usar o MAX.

Ou você percebeu alguma outra coisa?

 

Como eu estou usando SQL pra filtrar uma planilha excel, to carregando o código em asp e jogando os resultados como página web.

Acho que com um pouco de código eu consigo filtrar aquele último problema de registros da mesma transação com hora e t diferentes que ainda passam pelo filtro sql.

Isso pelo menos eu não consigo visualizar fazer com SQL

 

Abraço

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.