0
votes

Sélectionnez TimeStamp pour la fonction d'agrégation

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;


0 commentaires

3 Réponses :


0
votes

Je pense que vous voulez juste distinct sur : xxx


0 commentaires

0
votes

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


0 commentaires

0
votes

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


2 commentaires

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).