Maison > Questions et réponses > le corps du texte
P粉1414555122023-09-02 11:48:59
Je suppose que vous avez besoin des index suivants pour que la requête s'exécute correctement (vous ne devez le faire qu'une seule fois dans le cadre de la conception de la base de données).
CREATE INDEX IX ON price (code, stationID, date DESC, price)
Les deux premières colonnes peuvent être disposées dans n'importe quel ordre.
P粉2974349092023-09-02 00:29:02
Tant que la même code, stationID
paire ne peut pas avoir deux lignes avec la même date/heure, utiliser les fonctions de fenêtre revient un peu à utiliser une masse pour casser une noix.
select p.stationID, p.code, p.price, p.date from ( select code, stationID, max(date) as max_date from price group by code, stationID ) max join price p on max.code = p.code and max.stationID = p.stationID and max.max_date = p.date;
Il nécessite l'index suivant :
alter table price add index (code, stationID, date desc);
Cette requête devrait prendre moins de 1 ms puisque la table dérivée peut être construite à partir de l'index, puis elle lit uniquement les lignes requises de la table.
Alternativement, si vous savez que chaque code, stationID
paire recevra un prix mis à jour dans une période de temps spécifique (1 heure, 1 jour, 1 semaine), vous pouvez réduire considérablement la quantité de travail que la fonction de fenêtre doit effectuer en ajoutant une clause Where. :
with cte as ( select stationID as ind, code, price, date, row_number() over(partition by code, stationID order by date desc) as latest from price where date >= now() - interval 1 week ) select * from cte where latest = 1;