Danilo. 0 Denunciar post Postado Novembro 8, 2011 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
Motta 645 Denunciar post Postado Novembro 8, 2011 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
Danilo. 0 Denunciar post Postado Novembro 8, 2011 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
Henrique Barcelos 290 Denunciar post Postado Novembro 8, 2011 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
Motta 645 Denunciar post Postado Novembro 8, 2011 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
Danilo. 0 Denunciar post Postado Novembro 9, 2011 @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
Henrique Barcelos 290 Denunciar post Postado Novembro 10, 2011 E onde tem MAX na cláusula WHERE que eu postei? Compartilhar este post Link para o post Compartilhar em outros sites
Danilo. 0 Denunciar post Postado Novembro 10, 2011 E onde tem MAX na cláusula WHERE que eu postei? você só deu um apelido para MAX() " MAX(data) AS ultima_data" Depois chamou em WHERE, que de acordo com o manual MySql tb não pode: http://dev.mysql.com/doc/refman/4.1/pt/problems-with-alias.html de qq forma grato pela tentativa. Compartilhar este post Link para o post Compartilhar em outros sites
Henrique Barcelos 290 Denunciar post Postado Novembro 10, 2011 Puuutz.... ahsusahuas... falta de atenção. Estranho que no Postgree isso é aceito... :ermm: Compartilhar este post Link para o post Compartilhar em outros sites