J'ai deux tables:
SELECT p.id, max_price, actual_price, max_price_time
FROM products p
JOIN (SELECT max(price) as max_price, product_id
FROM prices_history
WHERE timestamp > '2019-02-01'
GROUP BY product_id) h
ON h.product_id = p.id
JOIN (SELECT timestamp as max_price_time, product_id, price
FROM prices_history
ORDER BY timestamp DESC LIMIT 1) h2
ON h2.product_id = p.id AND h2.price = max_price;
3 Réponses :
Je pense que vous voulez juste distinct sur code>:
Utilisez Row_Number ()
withe cte as
( SELECT p.*,ph.*,
row_number()over(partition by p.id order by timestamp desc,price desc)rn
FROM products p join prices_history ph on p.id = ph.product_id
) select * from cte where rn=1
Je suppose que votre problème est avec le fait que votre 2e sous-requête n'utilise aucun filtre et que vous trouvez essentiellement la même dernière horodatage (de tous les horodatamps, pas seulement pour celui-ci), qui ne correspond pas à ce que Avec l'une des priorités maximum_prices (les prix maximum de chaque produit ne sont jamais sur le dernier horodatage).
Ne tenez pas compte de ma réponse précédente. Ce pourrait être parce que je n'ai pas touché Pure SQL pendant un moment, mais je ne pouvais pas obtenir cette logique mise en œuvre par le groupe dans une seule requête (essayé de le faire dans la post-vitesse Sqlfiddle). Je pourrais avoir juré, je pouvais filtrer une requête groupée par des valeurs maximales au sein d'un groupe ... de toute façon, j'ai essayé de réécrire cette requête et je vois maintenant pourquoi vous avez utilisé des suqueries. P>
C'est toujours le même problème (pas de filtres). L'ajout de regroupement à votre 2e sous-requête fixe le problème. SQLFIDDLE CODE pour démontrer: P>
select p1.id, p1.max_price, p2.max_date
from ( select id, max(price) as max_price from prod group by id ) as p1
inner join ( select id, price, max(date) as max_date from prod group by id, price ) as p2
on p1.id = p2.id and p1.max_price = p2.price
Votre devinette a du sens pour moi! Je n'ai pas montré de filtres, mais si je les supprime et développez la plage de sélection, je peux obtenir le résultat où max_price sur le dernier horodatage). Donc, il n'est pas donné que réal_price n'est pas max_price dès donc 'ayant réal_price = max (prix)' clause non nécessaire. En outre, dans votre suggestion Max (horodatage) est le dernier horodatage, tandis que Max (Price) peut se produire plus tôt, c'est-à-dire sur différents horodatages
J'ai testé mon propre code dans sqlfiddle et cela ne compile même pas .. Non, je fous de ma suggestion ou de ma post-vitesse ne supporte pas le type de filtrage que je suggère. De toute façon, j'ai réécrit la requête et celle-ci fonctionne (vous devrez changer les noms).