Ir para conteúdo

POWERED BY:

Arquivado

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

Danilo.

SELECT exibindo ULTIMA DATA e DATA de 1 ANO atrás

Recommended Posts

Olá pessoal,

Tenho uma tabela com DATA, Indice_de_Preco (Dolar, TR, IGPM, etc), VALOR.

o que preciso é informar qual a variação do Dolar por exemplo, nos ultimos 12 meses, ou 6 meses etc.

Seria +ou- isso:

SELECT  *	FROM Tabela AS t1 
	LEFT JOIN Tabela AS t2 ON t1.Indice = t2.Indice  
	WHERE t1.Indice = 'Dolar' 
	AND t1.Data = max(t1.Data)  
	AND t2.Data = (max(t1.Data) - 1 ANO)

 

Porem tem dois Problemas ai:

1. o Mysql não aceita Max na clausula WHERE, pra eu pegar a ultima data do DB

2. Um ano atrás pode cair num Domingo ou Sábado e ai evidentemente não terá o registro desse dia q precisaria pegar o proximo dia disponivel.

 

De repente eu to pensando errado e tem alguma forma bem mais facil. Alguem tem alguma solução?

 

agradeço desde já a atenção,

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente algo assim

 

SELECT *
FROM   TABELA T1,TABELA T2
WHERE  T1.DATA = (SELECT MAX(T3.DATA) FROM TABELA T3 WHERE T3.DATA <= <HOJE>)
AND    T2.DATA = (SELECT MAX(T4.DATA) FROM TABELA T4 WHERE T4.DATA <= <HOJE-365>)

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente algo assim

 

SELECT *
FROM   TABELA T1,TABELA T2
WHERE  T1.DATA = (SELECT MAX(T3.DATA) FROM TABELA T3 WHERE T3.DATA <= <HOJE>)
AND    T2.DATA = (SELECT MAX(T4.DATA) FROM TABELA T4 WHERE T4.DATA <= <HOJE-365>)

 

Olá Motta, grato por sua atenção,

Sua sugestão funcionou parcialmente, devido eu ter indicadores internacionais, como Euro/Dolar por exemplo, existe situações onde se um ano atrás desse num feriado nacional, só mostraria esses indices internacionais, então eu adaptei para o sql abaixo, ...

SELECT *
FROM   Tabela  T1 ,Tabela  T2 
WHERE  T1.Indice = T2.Indice  
AND T1.DATA  = (SELECT MAX( T3.DATA ) FROM Tabela  T3  WHERE  T3.DATA  <= curdate() )
AND T2.DATA  = (SELECT MAX( T4.DATA ) FROM Tabela  T4  WHERE  T4.DATA  <= AddDate(curdate(), INTERVAL -1 YEAR) 
               AND  T1.Indice = T4.Indice ) 

Que parece ter atendido bem, masssss a consulta ficou lenta, e a tabela ja tem index em Data e Indice(_de_Preco).

Alguma Sugestão que possa otimizar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

SELECT *, MAX(data) AS ultima_data FROM tabela t1 INNER JOIN tabela t2 USING indice WHERE t2.data DATE_SUB(ultima_data, INTERVAL 1 YEAR) LIMIT 1

 

Eu não entendi direito a necessidade do JOIN...

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema pode estar na pesquisa do tipo <=

 

T3.DATA  <= curdate() 

 

talvez uma pesquisa antes para saber as data exatas de/até melhore a questão.Depende da aplicação.

 

agora, lento é relativo, um relatório tirado esporadicamente não precisa necessariamente ser tão rápido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Henrique, grato pela sua atenção, mas o MySql não aceita o uso de MAX() na Clausula WHERE

 

@Motta, obrigado mais uma vez pelo retorno. Na verdade cada consulta ficou com cerca de 2 Segundos devido a Subquery, so que como na verdade eu preciso buscar 9 datas diferentes (No Ano, em 1 ano, mes, semana, trimestre, etc) ficou algo em torno de 18 segundos, mas realmente é um consulta q posso jogar num arquivo TXT e rodá-la apenas uma vez por dia.

De qq modo valeu pela ajuda.

 

Sem abusar de sua ajuda, Será q você não consegue me ajudar em uma outra? eu postei um topico na área de ASP aqui no iMaster, mas acho q seria até melhor transferir o topico pra cá:

http://forum.imasters.com.br/topic/448823-listar-10-pedido-de-cada-vendedor/

grato.

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.