SQL Ultima Data (utilizando MAX)

Bom dia gente!
Procurei um monte na Internet, achei algumas respostas aqui no blog mesmo, mas as que tentei aplicar em minha SQL, não funcionaram.
É o seguinte:
meu select envolve 3 tabelas; é para um controle de estoque, onde ele vai pegar a ID do Produto, os três tipos de quantidade, a chave de busca e uns campos padrão; mais a unidade de medida e então a data, que eu qria trazer a ultima, pois esse controle é para saber quais produtos do estoque estão zerados e pela data, quando foi a ultima saída, pra saber se precisa ou não comprar o produto novamente.
Não sei se ficou claro.

Abaixo a minha SQL:

SELECT sum(ms.qtyonhand) AS qtyonhand, sum(ms.qtyreserved) AS qtyreserved, sum(ms.qtyordered) AS qtyordered,
ms.m_product_id, mp.value, ms.ad_client_id, mp.ad_org_id, ms.isactive, mp.c_uom_id, max(mt.movementdate) as movementdate
FROM m_storage ms
INNER JOIN m_product mp ON ms.m_product_id = mp.m_product_id
INNER JOIN m_transaction mt ON mp.m_product_id = mt.m_product_id
GROUP BY ms.ad_client_id, mp.ad_org_id, ms.m_product_id, mp.value, ms.isactive, c_uom_id, movementdate
HAVING sum(ms.qtyonhand) = 0::numeric AND sum(ms.qtyreserved) = 0::numeric AND sum(ms.qtyordered) = 0::numeric;

Não retorna nenhum erro, mas ele fica procurando registros e não termina nunca. Esperei uns 5 minutos e a consulta continuava.
Para esclarecer, uso o Postgree

Desde já agradeço. :smiley:

Bom, achei uma solução, minha SQL ficou assim:

SELECT sum(ms.qtyonhand) AS qtyonhand, sum(ms.qtyreserved) AS qtyreserved, sum(ms.qtyordered) AS qtyordered,
ms.m_product_id, mp.value, ms.ad_client_id, mp.ad_org_id, ms.isactive, mp.c_uom_id, max(mt.movementdate)
FROM m_storage ms
INNER JOIN m_product mp ON ms.m_product_id = mp.m_product_id
LEFT JOIN m_transaction mt ON mp.m_product_id = mt.m_product_id
GROUP BY ms.ad_client_id, mp.ad_org_id, ms.m_product_id, mp.value, ms.isactive, c_uom_id
HAVING sum(ms.qtyonhand) = 0::numeric
AND sum(ms.qtyreserved) = 0::numeric
AND sum(ms.qtyordered) = 0::numeric
AND max(mt.movementdate) <= now();

Demora um pouco, mas trás os resultados; vou verificar agora como fica no relatório.
Se tiverem sujestões de otimização, agradeço :smiley: