Ir para conteúdo

Arquivado

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

rdpacato

SELECT comparando datas

Recommended Posts

Pessoal,

 

Não sei como fazer e se da para fazer isso...

 

Tenho essa query abaixo para que me retornam duas ou três linhas de resultado...

 

A diferença dela é um campo chamado fonte e data, mas o resto é idêntico...

 

Só que esse campo data estão em duas tabelas diferentes, e queria comparar com ela, onde a data a tabela que tiver a data maior me traga o resultado, eliminando o outro resultado....

 

SELECT DISTINCT (Dispositivo.Numero) AS Dispositivo, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoTecnologia) AS CodTecnologia, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoAPNConfigurada) AS APNConfigurada, 
(SIMCard.Numero) AS SIMCard, 
(Linha.Numero) AS Linha, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoOperadora) AS Operadora, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoAPNProvisionada) AS APNProvisionada, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoStatusSIMCard) AS StatusSIMCard, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Processamento.CodigoFonteDados) AS Fonte, 
(Dispositivo.IMEI) AS IMEI, 
(SIMCard.IMSI) AS IMSI, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Linha.CodigoStatusLinha) AS StatusLinha, 
(SIMCard.ConsumoDados) AS ConsDados, 
(SIMCard.MatriculaAlteracao) AS Matricula
FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero
LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero AND (SIMCard.DataAlteracao >= Dispositivo.DataAlteracao OR Dispositivo.DataAlteracao >= SIMCard.DataAlteracao)
INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha
LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento)
WHERE SIMCard.Numero = 89550232280000892281

 

 

Os campos Datas e suas tabelas:

 

(SIMCard.DataAlteracao) AS DataAlteracao,
(Dispositivo.DataAlteracao) AS DataAlteracaoDis

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Motta.. valeu pela resposta é isso mesmo que eu quero....

 

Só que.... rsrs

 

 

Eu não sei como implantar isso nessa minha tabela...

 

Pois tenho que vincular as tabelas SIMCard e Dispositivo, e tem uma tabela que cria o vínculo delas (SIMCardDispositivo) onde só lá que possuem algo para comparar (t1 = t2)

 

Pois elas não possuem um campo nome ou código iguais...

 

Ficaria mais ou menos assim??

 

			(SIMCard.DataAlteracao) AS DataAlt,
			(Dispositivo.DataAlteracao) AS DataAlt
			FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero
			LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero
			INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha
			LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento)
			WHERE SIMCard.Numero = 89550232280000892281

			
			AND DataAlt = (select max(DataAlt)
			from SIMCardDispositivo, SIMCard, Dispositivo
			where SIMCardDispositivo.simcard_numero = SIMCard.numero
			AND SIMCard.DataAlteracao
			AND Dispositivo.DataAlteracao)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo assim , creio :

 

 

SELECT ...
FROM SIMCard
LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero
LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero AND (SIMCard.DataAlteracao >= Dispositivo.DataAlteracao OR Dispositivo.DataAlteracao >= SIMCard.DataAlteracao)
INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha
LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento)
WHERE SIMCard.Numero = 89550232280000892281
AND SIMCardDispositivo.dATA = (SELECT MAX(SIMCardDispositivo2.Data
                               from SIMCardDispositivo SIMCardDispositivo2
                               where SIMCardDispositivo2.Dispositivo_Numero = SIMCardDispositivo.Dispositivo_Numero)
AND Dispositivo.dATA = (SELECT MAX(Dispositivo2.Data
                               from Dispositivo Dispositivo2
                               where Dispositivo2.Dispositivo_Numero = Dispositivo.Dispositivo_Numero) 

 


Compartilhar este post


Link para o post
Compartilhar em outros sites

Me desculpe Motta.. mas ainda não entendi...

 

 

Tenho:

tabela A (SIMCard que possui um número X e uma Data)

tabela B (Dispositivo que possui um número Y e uma Data)

tabela C (SIMCardDispositivo que possui o X e o Y para vincular as tabelas)

 

Quero ver qual das tabelas A ou B, está com a data maior, e desconsiderar o menor....

 

Ficou mais claro o meu enrosco? rsrs

 


 


Coloquei assim:

 

 

 

SELECT DISTINCT (Dispositivo.Numero) AS Dispositivo, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoTecnologia) AS CodTecnologia, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoAPNConfigurada) AS APNConfigurada, 
			(SIMCard.Numero) AS SIMCard, 
			(Linha.Numero) AS Linha, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoOperadora) AS Operadora, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoAPNProvisionada) AS APNProvisionada, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoStatusSIMCard) AS StatusSIMCard, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Processamento.CodigoFonteDados) AS Fonte, 
			(Dispositivo.IMEI) AS IMEI, 
			(SIMCard.IMSI) AS IMSI, 
			(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Linha.CodigoStatusLinha) AS StatusLinha, 
			(SIMCard.ConsumoDados) AS ConsDados, 
			(SIMCard.MatriculaAlteracao) AS Matricula,
			SIMCard.DataAlteracao AS DataAlt,
			Dispositivo.DataAlteracao AS DataAlt
			FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero
			LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero
			INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha
			LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento)
			WHERE SIMCard.Numero = 89550232280000892281

			AND SIMCard.DataAlteracao = (SELECT MAX(SIMCard.DataAlteracao)
                               from SIMCard, SIMCardDispositivo
                               where SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero)

			       AND Dispositivo.DataAlteracao = (SELECT MAX(Dispositivo.DataAlteracao)
                               from Dispositivo, SIMCardDispositivo
                               where SIMCardDispositivo.Dispositivo_Numero = Dispositivo.Numero) 

FONTE DATA SIMCard Data Dispositivo

"CTR"; "2013-06-14 14:21:55"; "2013-06-17 09:01:05"
"TELECOM"; "2013-06-14 14:21:55"; "2013-06-17 09:01:05"

 

 

Tem esse campo fonte que trás os dois resultados... eles são idênticos, tirando esse campo e o data... ai queria pegar só o que tem maior data... que seria da Tabela Dispositivo nesse caso...

 

E não sei como fazer o select dessa data tbm para ser mostrada


Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho:

tabela A (SIMCard que possui um número X e uma Data)

tabela B (Dispositivo que possui um número Y e uma Data)

tabela C (SIMCardDispositivo que possui o X e o Y para vincular as tabelas)

 

Quero ver qual das tabelas A ou B, está com a data maior, e desconsiderar o menor....

 

troque SIMCardDispositivo por SIMCard , creio que resolve.

...

 

 

AND SIMCard.dATA = (SELECT MAX(SIMCard2.Data                                
                               from SIMCard SIMCard2                                
                               where SIMCard2.Dispositivo_Numero = SIMCard.Dispositivo_Numero) 
AND Dispositivo.dATA = (SELECT MAX(Dispositivo2.Data                                
                        from Dispositivo Dispositivo2                                
                        where Dispositivo2.Dispositivo_Numero = Dispositivo.Dispositivo_Numero) 

entenda a lógica, o sub-select retorna a maior data, filtrando apenas as maiores pela chave de cada tabela (SIMCard.Dispositivo_Numero ou Dispositivo.Dispositivo_Numer)

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

é que eu não posso tirar essa tabela simcarddispositivo po simcard...

 

 

é uma regra de negócio...

 

 

por isso to apanhando... não sei como vincular os dois... e as tabelas A e B (SIMCard e Dispositivo) não possuem nenhuma chave para vincular

Compartilhar este post


Link para o post
Compartilhar em outros sites

é que eu não posso tirar essa tabela simcarddispositivo po simcard...

 

não tire, troque só pelo sub-select que testa a data máxima

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi... mas no select....

 

tem o campo fonte, e está trazendo de toda maneira dois resultados... E também não sei como colocar no select a data.. pois de qual tabela farei a consulta?

 

 

Desculpe pelas perguntas, é que não to muito antenado em BD... faz muito tempo... por isso to apanhando muito...

Compartilhar este post


Link para o post
Compartilhar em outros sites

São dois resultados pois tem duas datas máximas ( das duas tabelas) , fosse minha esta query eu começava do zero.

Este monte de "select" como coluna me dá arrepios ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sei Motta.. eu to pegando de um projeto já implantado...

 

e não sei como arrumar esse problema de dois registros... Pensei que pelo BD seria mais fácil... mas to vendo que vai ser melhor mudar na aplicação...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dispositivo tem alguma relação com SIMCardDispositivo ?!

 

pense em duas queries com union , até gerando uma view

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço.

O que eu faria seria escrever a query do zero.

Escreva primeiro o que se quer

Depois faça por partes até obter o resultado que se quer, e algumas queries não são simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza...

 

Vou colocar como resolvido para parar de te alugar....rsrs... muito obrigado pela ajuda...

 

quando eu resolver eu coloco a resposta..

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tivesse eu enrolado até tentava te ajudar, mas a fase aqui está brava ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui assim:

 

SELECT DISTINCT (Dispositivo.Numero) AS Dispositivo, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoTecnologia) AS CodTecnologia, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoAPNConfigurada) AS APNConfigurada, 
(SIMCard.Numero) AS SIMCard, 
(Linha.Numero) AS Linha, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoOperadora) AS Operadora, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoAPNProvisionada) AS APNProvisionada, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoStatusSIMCard) AS StatusSIMCard, 
string_agg((SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Processamento.CodigoFonteDados), '/' ORDER BY CodigoFonteDados) AS Fonte, 
(Dispositivo.IMEI) AS IMEI, 
(SIMCard.IMSI) AS IMSI, 
(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Linha.CodigoStatusLinha) AS StatusLinha, 
(SIMCard.ConsumoDados) AS ConsDados, 
(SIMCard.MatriculaAlteracao) AS Matricula, 
CASE WHEN SIMCard.dataAlteracao > Dispositivo.dataAlteracao THEN SIMCard.dataAlteracao ELSE Dispositivo.dataAlteracao END AS dataAlt 
FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero 
LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero 
INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha 
LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento) 
WHERE SIMCard.Numero = numeric 
GROUP BY Dispositivo, SIMCard, Linha 

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.