Domanda

È possibile fare una semplice query per contare quanti record ho in un determinato periodo di tempo come un anno, mese o giorno, avendo un TIMESTAMP campo, come:

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

O anche:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

Per avere una statistica mensile.

Grazie!

È stato utile?

Soluzione

GROUP BY YEAR(record_date), MONTH(record_date)

Controlla la data di rel="noreferrer"> in MySQL.

Altri suggerimenti

GROUP BY FORMATO DATA(record_date, '%Y%m')

Nota (principalmente, ai potenziali downvoter).Attualmente, questo potrebbe non essere efficace come altri suggerimenti.Tuttavia, lo lascio come alternativa, e anche un'alternativa che può servire a vedere quanto siano più veloci le altre soluzioni.(Perché non è possibile distinguere la velocità dalla lentezza finché non si vede la differenza.) Inoltre, col passare del tempo, potrebbero essere apportate modifiche al motore di MySQL per quanto riguarda l'ottimizzazione in modo da rendere questa soluzione, in alcuni casi (forse non così distanti) in futuro, per diventare abbastanza paragonabili in termini di efficienza alla maggior parte degli altri.

Ho provato ad utilizzare il 'dove' dichiarazione di cui sopra, ho pensato che la sua corretta dal momento che nessuno corresse, ma mi sbagliavo; dopo alcune ricerche ho scoperto che questa è la formula giusta per l'istruzione WHERE in modo che il codice diventa in questo modo:

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

provare questo

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

ESTRATTO (unità dalla data) funzione è meglio come meno raggruppamento è utilizzato e la funzione ritorna un valore numerico.

condizione di confronto quando il raggruppamento sarà più veloce di funzione DATE_FORMAT (che restituiscono un valore di stringa). Provare a utilizzare la funzione | campo che restituiscono valore non stringa per condizione di confronto SQL (WHERE, HAVING, ORDER BY, GROUP BY)

.

Se la vostra ricerca è finita da diversi anni, e ancora voglia di gruppo mensile, suggerisco:

Versione # 1:

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

Versione # 2 (bassi consumi)

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

ho confrontato queste versioni su un grande tavolo con 1,357,918 righe (), e la seconda versione sembra avere risultati migliori.

version1 (media di 10 esegue) : 1.404 secondi
version2 (media di 10 esegue) : 0,780 secondi

(SQL_NO_CACHE chiave aggiunto per evitare che MySQL da CACHING alle query.)

Se si desidera raggruppare in base alla data in MySQL quindi utilizzare il codice qui sotto:

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

Spero che questo consente di risparmiare tempo per quelli che stanno andando a trovare questo thread.

Se si desidera filtrare i record per un determinato anno (ad esempio, 2000) quindi ottimizzare il WHERE clausola in questo modo:

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.

Al posto di:

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

I risultati sono stati generati contro una tabella contenente 300k righe e indice di colonna data.

Per quanto riguarda la clausola GROUP BY, ho testato le tre varianti contro la tabella sopra indicato; ecco i risultati:

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.

L'ultimo è il vincitore.

Soluzione completa e semplice con l'esecuzione in modo simile ma più breve e più flessibile alternativa attualmente attivo:

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

Se si desidera ottenere una statistica mensili con conteggi delle righe per ogni mese di ogni anno ordinata da ultimo mese, quindi provare questo:

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

È possibile farlo semplicemente Mysql DATE_FORMAT () funzione GROUP BY. Si consiglia di aggiungere una colonna aggiuntiva per chiarezza aggiunta in alcuni casi, come ad esempio dove registrazioni si protraggono per diversi anni, poi nello stesso mese si verifica in diverse years.Here opzione così tanti è possibile personalizzare questo. Si prega di leggere questo befor di partenza. Spero che dovrebbe essere molto utile per voi. Ecco query di esempio per la vostra comprensione

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR,

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

La query seguente ha lavorato per me in Oracle Database Release 12c 12.1.0.1.0

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

Io preferisco per ottimizzare la selezione del gruppo uno anno in questo modo:

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;

In questo modo si può semplicemente legare l'anno in una sola volta, ad esempio, '2009', con un parametro denominato e non hanno bisogno di preoccuparsi di aggiungere '-01-01' o passando '2010' separatamente.

Inoltre, come presumibilmente stiamo solo contando le righe e id è mai NULL, preferisco COUNT(*) a COUNT(id).

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

.... group by to_char(date,'YY') ---> 89

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top