Question Requête MySQL GROUP BY jour / mois / année


Est-il possible que je fasse une requête simple pour compter combien de disques j'ai dans une période 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

Avoir une statistique mensuelle.

Merci!


532
2018-02-03 20:29


origine


Réponses:


GROUP BY YEAR(record_date), MONTH(record_date)

Vérifiez fonctions de date et d'heure en MySQL.


835
2018-02-03 20:33



GROUP BY FORMAT DE DATE(record_date, '%Y%m')

Remarque (principalement, aux potentiels downvoters). Actuellement, cela peut ne pas être aussi efficace que d'autres suggestions. Pourtant, je le laisse comme une alternative, et un, aussi, qui peut servir à voir à quelle vitesse d'autres solutions sont. (Car vous ne pouvez pas vraiment dire à partir de lent jusqu'à ce que vous voyez la différence.) Aussi, au fil du temps, des changements pourraient être apportés au moteur de MySQL en ce qui concerne l'optimisation afin de faire cette solution, peut-être pas lointain) point à l'avenir, de devenir tout à fait comparable en efficacité avec la plupart des autres.


182
2018-04-23 19:33



J'ai essayé d'utiliser le 'WHERE' ci-dessus, je pensais que c'était correct puisque personne ne le corrigeait 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:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

38
2018-04-23 17:52



essaye celui-là

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRAIT (unité de date) la fonction est meilleure car moins de regroupement est utilisé et la fonction renvoie une valeur numérique.

La condition de comparaison lorsque le regroupement sera plus rapide que la fonction DATE_FORMAT (qui renvoie une valeur de chaîne). Essayez d'utiliser function | field qui renvoie une valeur non-chaîne pour la condition de comparaison SQL (WHERE, HAVING, ORDER BY, GROUP BY).


36
2017-10-11 03:44



Si votre recherche dure plusieurs années et que vous voulez toujours vous regrouper tous les mois, je suggère:

version 1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

version 2 (plus efficace):

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

J'ai comparé ces versions sur une grande table avec 1 357 918 lignes (), et la 2ème version semble avoir de meilleurs résultats.

version 1  (moyenne de 10 exécutions): 1.404 secondes
version 2  (moyenne de 10 exécutions): 0.780 secondes

(SQL_NO_CACHE clé ajoutée pour empêcher MySQL de CACHER aux requêtes.)


21
2018-06-09 09:17



Si vous souhaitez regrouper par date dans MySQL, utilisez le code ci-dessous:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

J'espère que cela économise du temps pour ceux qui vont trouver ce fil.


15
2017-10-10 05:16



Si vous souhaitez filtrer les enregistrements pour une année donnée (par exemple, 2000), optimisez WHERE clause comme ceci:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

Au lieu de:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

Les résultats ont été générés sur une table contenant 300k lignes et une colonne index sur date.

En ce qui concerne la GROUP BY clause, j'ai testé les trois variantes par rapport au tableau ci-dessus; Voici les résultats:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

Le dernier est le gagnant.


10
2018-01-18 10:26



Si vous souhaitez obtenir une statistique mensuelle avec le nombre de lignes par mois de chaque année, en fonction du dernier mois, essayez ceci:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

7
2017-11-22 00:01



La requête suivante a fonctionné pour moi dans Oracle Database 12c Release 12.1.0.1.0

SELECT COUNT(*)
FROM stats
GROUP BY 
extract(MONTH FROM TIMESTAMP),
extract(MONTH FROM TIMESTAMP),
extract(YEAR  FROM TIMESTAMP);

6
2018-05-22 06:32