Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL :Récupération de la somme totale en tant que sous-sélection très lente

Plutôt que de regrouper sur tous ces champs, une solution plus simple (et plus rapide) (de ici ) peut être :

GROUP BY UNIX_TIMESTAMP(timestamp_local)/3600

Je ne peux pas imaginer que votre requête renvoie les résultats souhaités (si je comprends correctement vos besoins). Je comprends vos besoins car, lorsqu'il n'y a pas de lignes pour une heure donnée, vous souhaitez calculer la somme de toutes les lignes avec heure

À ma connaissance, il n'y a pas de moyen simple et efficace de le faire dans MySQL, je suggérerais de créer une table temporaire avec toutes les valeurs de regroupement possibles dans la plage que vous regardez (probablement avec une boucle). Vous pouvez probablement configurer ce tableau à l'avance pendant quelques années et éventuellement ajouter des lignes si nécessaire. Ensuite, vous pouvez simplement rejoindre à gauche cette table et votre table.

Si vous utilisiez MSSQL, vous auriez pu utiliser un CTE récursif, même si cela aurait probablement été très lent. Regardez ceci ou google "mysql cte" pour les alternatives MySQL. La façon de faire cela avec la récursivité est de joindre (à gauche) sur la même table à plusieurs reprises pour HOUR = HOUR+1 jusqu'à ce que vous obteniez une valeur non NULL, puis arrêtez. Pour chacun d'eux, vous calculerez la somme à l'envers.