Est-il possible de faire une simple requête pour compter le nombre d'enregistrements que j'ai dans une période de temps déterminée comme une année, un mois ou un jour, ayant un TIMESTAMP
champ, comme:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Ou même:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Pour avoir une statistique mensuelle.
Merci!
GROUP BY record_date.MONTH
dans votre premier extrait de code?Réponses:
Découvrez les fonctions de date et d'heure dans MySQL.
la source
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
remarque: date_enregistrement est un type de date TIMESTAMPRemarque (principalement, pour les downvoters potentiels). Actuellement, cela peut ne pas être aussi efficace que d'autres suggestions. Pourtant, je le laisse comme une alternative, et une solution qui peut également servir à voir à quel point les autres solutions sont plus rapides. (Car vous ne pouvez pas vraiment dire rapide de lent jusqu'à ce que vous voyez la différence.) De plus, au fil du temps, des modifications pourraient être apportées au moteur de MySQL en ce qui concerne l'optimisation afin de rendre cette solution, à certains (peut-être pas éloigné) à l'avenir, pour devenir tout à fait comparable en efficacité avec la plupart des autres.
la source
EXTRACT()
peuvent être plus efficaces queDATE_FORMAT()
. (Je n'ai pas de MySQL pour les tests appropriés, cependant.)essaye celui-là
La fonction EXTRACT (unit FROM date) est meilleure car moins de regroupement est utilisé et la fonction renvoie une valeur numérique.
La condition de comparaison lors du regroupement sera plus rapide que la fonction DATE_FORMAT (qui renvoie une valeur de chaîne). Essayez d'utiliser la fonction | champ qui renvoie une valeur non chaîne pour la condition de comparaison SQL (WHERE, HAVING, ORDER BY, GROUP BY).
la source
J'ai essayé d'utiliser la déclaration «WHERE» ci-dessus, je pensais que c'était correct car personne ne l'avait corrigé mais j'avais tort; après quelques recherches, j'ai découvert que c'est la bonne formule pour l'instruction WHERE donc le code devient comme ceci:
la source
Si votre recherche s'étale sur plusieurs années et que vous souhaitez tout de même vous regrouper mensuellement, je vous suggère:
version 1:
version # 2 (plus efficace) :
J'ai comparé ces versions sur une grande table avec 1 357 918 lignes (innodb), et la 2e version semble avoir de meilleurs résultats.
version1 (moyenne de 10 exécutions) : 1,404 seconde
version2 (moyenne de 10 exécutions) : 0,780 seconde
(
SQL_NO_CACHE
clé ajoutée pour empêcher MySQL de mettre en cache les requêtes.)la source
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, mais pourquoi ne pas testerGROUP BY YEAR(record_date), MONTH(record_date)
également?*100
sur la versión # 2? Merci d'avance.*100
àYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Si vous souhaitez regrouper par date dans MySQL, utilisez le code ci-dessous:
J'espère que cela fait gagner du temps à ceux qui vont trouver ce fil.
la source
MONTH(record_date)
les données pour tenir compte de plusieurs mois.Si vous souhaitez filtrer les enregistrements d'une année particulière (par exemple 2000), optimisez la
WHERE
clause comme ceci:Au lieu de:
Les résultats ont été générés par rapport à un tableau contenant 300 000 lignes et une colonne d'index sur la date.
Quant à la
GROUP BY
clause, j'ai testé les trois variantes par rapport au tableau mentionné ci-dessus; Voici les résultats:Le dernier est le gagnant.
la source
Solution complète et simple avec une alternative similaire, plus performante mais plus courte et plus flexible actuellement active:
la source
Si vous souhaitez obtenir des statistiques mensuelles avec le nombre de lignes par mois de chaque année ordonné par le dernier mois, essayez ceci:
la source
Vous pouvez le faire simplement avec la fonction Mysql DATE_FORMAT () dans GROUP BY. Vous voudrez peut-être ajouter une colonne supplémentaire pour plus de clarté dans certains cas, par exemple lorsque les enregistrements s'étalent sur plusieurs années, puis le même mois se produit sur différentes années. Voici autant d'options que vous pouvez personnaliser. Veuillez lire ceci avant de commencer. J'espère que cela devrait être très utile pour vous. Voici un exemple de requête pour votre compréhension
la source
La requête suivante a fonctionné pour moi dans Oracle Database 12c version 12.1.0.1.0
la source
Je préfère optimiser la sélection de groupe d'un an comme suit:
De cette façon, vous pouvez simplement lier l'année en une seule fois, par exemple
'2009'
, avec un paramètre nommé et ne pas avoir à vous soucier d'ajouter'-01-01'
ou de passer'2010'
séparément.En outre, comme sans doute nous comptons simplement des lignes et
id
est jamaisNULL
, je préfèreCOUNT(*)
àCOUNT(id)
.la source
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> MAI.... group by to_char(date,'YY')
---> 89la source