Ir para conteúdo

POWERED BY:

Arquivado

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

janioaguiar

Pegar ultimos registros da Tabela

Recommended Posts

Olá a todos,

 

Tenho a seguinte tabela:

 

---------------------------------
Mov | Produto | Saldo | Data
---------------------------------
7 1 10 01.02.2013
10 3 3 02.09.2013
12 1 2 15.04.2013
6 2 7 03.07.2013
8 2 5 09.07.2013
13 3 14 12.12.2013

 

Preciso pegar a ULTIMA OCORRÊNCIA de cada Produto, mim retornando:

 

---------------------------------
Mov | Produto | Saldo | Data
---------------------------------
12 1 2 15.04.2013
8 2 5 09.07.2013
13 3 14 12.12.2013

 

Para isso tenho feito:

 

SELECT mov, produto, saldo, Max(data) FROM tabela GROUP BY produto

 

Mas num tem funcionado. Até q ele tem pego a ULTIMA data de cada produto. Porém, os outros Campos (Mov e Saldo) tem vindo os da primeira ocorrência, e não da ultima

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu adaptaria uma query a partir desta sua...

SELECT t1.mov, t1.produto, t1.saldo. t1.`data`
FROM tabela t1, (
  SELECT produto, Max(data) `data` FROM tabela GROUP BY produto
) v
WHERE t1.produto = v.produto AND t1.`data` = v.`data`

Primeiro, eu listo todos os registros da tabela `tabela`, ou `t1`(ALIAS), depois eu faço uma subquery com a consulta que você criou, pois nela é retornado o id do produto e a data da última ocorrência, e dentro do WHERE eu relaciono as duas "tabelas", a tabela `t1` e a tabela virtual `v`.

Compartilhar este post


Link para o post
Compartilhar em outros sites

lokaodomau

 

seu codigo funcionou perfeitamente.

 

So tem um 'porém' que esqueci de mencionar: preciso q esse filtro funcione limitado a uma data x. Exemplo: Pegar os ultimos lançamentos dos produtos em que a data seja <= 31.12.2013.

 

---------------------------------
Mov | Produto | Saldo | Data
---------------------------------
7 1 10 01.02.2013
10 3 3 02.09.2013
12 1 2 15.04.2013
6 2 7 03.07.2013
8 2 5 09.07.2013
13 3 14 12.12.2013

23 1 4 05.01.2014

 

Resultar:

 

---------------------------------
Mov | Produto | Saldo | Data
---------------------------------
12 1 2 15.04.2013
8 2 5 09.07.2013
13 3 14 12.12.2013

 

Ou seja, embora o PRODUTO 1 tenha como ultimo lançamento a data 05.01.2014, ele num entrou no filtro pq sua data eh > 31.12.2013

 

 

Tentei algumas coisas aqui pra incluir isso, mas deu erro de sintaxe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca o filtro dentro da subquery:

WHERE
/* DATE(`data`) BETWEEN '2013-01-01' AND '2013-12-31' # quando pesquisar entre as datas */
DATE(`data`) <= '2013-12-31'

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas nesse caso ele ta retornando TODOS os lanc menores q 31.12.2013 de CADA PRODUTO.

 

Do produto 1, no caso, ele retornou os lançamentos com data 01.02.2013 e 15.04.2013 e nao SOMENTE este ultimo (por ser o de maior data).

 

Parece q deixou de obedecer Max() e passou a considerar apenas DATE(`data`) <= '2013-12-31'

 

 

[editado]

Nao, nao, amigo. O problema aqui eh mais complexo do q eu podia imaginar.

 

Na verdade se o PRODUTO 1, por exemplo, tiver 05 lançamentos para uma MESMA DATA (a maior) , ele ta retornando todos esses lançamentos, e não apenas UM como eu queria q fosse.

 

E de 05 lançamentos com mesma data, qual deveria retornar? aquele q tivesse o MOV maior.

 

PS. Campo MOV eh NUMERO e autoincrement.

 

Meio complicado, mas eh isso q preciso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta seguir o raciocínio, na subquery:

SELECT produto, MAX(mov) mov, MAX(`data`) `data` FROM tabela GROUP BY produto

E também na condicional que determina o relacionamento:

WHERE t1.produto = v.produto AND t1.`data` = v.`data` AND t1.mov = v.mov

PS: Não acha que este campo `data` deveria ser DATETIME?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, nao!

 

Sou programador xbase e atraves de um RDD uso MySql atraves de comandos xbase. O bom eh q posso usar tbm comandos sql para acelerar consultas. Por isso não posso mudar para DateTime pq em dbf não existe esse tipo de campo.

 

Mas pelos seus exemplos ja deu pra eu chegar aqui onde eu queria.

 

Vlw

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.