É possível fazer uma consulta simples para contar quantos registros eu tenho em um determinado período de tempo, como um ano, mês ou dia, com um TIMESTAMP
campo, como:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Ou até:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Ter uma estatística mensal.
Obrigado!
GROUP BY record_date.MONTH
no seu primeiro trecho de código?Respostas:
Confira as funções de data e hora no MySQL.
fonte
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
note: record_date é um tipo de data TIMESTAMPNota (principalmente, para potenciais downvoters). Atualmente, isso pode não ser tão eficiente quanto outras sugestões. Ainda assim, deixo isso como uma alternativa, e também uma que pode servir para ver a rapidez com que outras soluções são. (Pois você não pode realmente dizer rápido de devagar até perceber a diferença.) Além disso, com o passar do tempo, podem ser feitas alterações no mecanismo do MySQL no que diz respeito à otimização, a fim de tornar essa solução, em alguns (talvez, não tão distante) no futuro, para se tornar bastante comparável em eficiência com a maioria dos outros.
fonte
EXTRACT()
podem ser mais eficientes queDATE_FORMAT()
. (Eu não tenho um MySQL para um teste adequado, no entanto.)tente este
A função EXTRACT (unit FROM date) é melhor, pois menos agrupamento é usado e a função retorna um valor numérico.
A condição de comparação ao agrupar será mais rápida que a função DATE_FORMAT (que retorna um valor de sequência). Tente usar o campo function | que retorne valor não-string para a condição de comparação SQL (WHERE, HAVING, ORDER BY, GROUP BY).
fonte
Tentei usar a declaração 'WHERE' acima, achei correta, pois ninguém a corrigiu, mas estava errado; depois de algumas pesquisas, descobri que essa é a fórmula correta para a instrução WHERE, para que o código fique assim:
fonte
Se sua pesquisa durar vários anos e você ainda desejar agrupar mensalmente, sugiro:
versão 1:
versão 2 (mais eficiente) :
Comparei essas versões em uma grande mesa com 1.357.918 linhas (innodb) e a segunda versão parece ter melhores resultados.
version1 (média de 10 execuções) : 1.404 segundos
version2 (média de 10 execuções) : 0.780 segundos
(
SQL_NO_CACHE
chave adicionada para impedir o MySQL de CACHING para consultas.)fonte
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, mas por que não testarGROUP BY YEAR(record_date), MONTH(record_date)
também?*100
na versão # 2? Desde já, obrigado.*100
aYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Se você deseja agrupar por data no MySQL, use o código abaixo:
Espero que isso economize algum tempo para aqueles que encontrarão esse tópico.
fonte
MONTH(record_date)
e contabilizar vários meses.Se você deseja filtrar registros para um ano específico (por exemplo, 2000), otimize a
WHERE
cláusula assim:Ao invés de:
Os resultados foram gerados em uma tabela contendo 300k linhas e índice na coluna de data.
Quanto à
GROUP BY
cláusula, testei as três variantes na tabela acima mencionada; aqui estão os resultados:O último é o vencedor.
fonte
Solução completa e simples, com desempenho semelhante, porém mais curto e flexível, atualmente ativo:
fonte
Se você deseja obter estatísticas mensais com contagens de linhas por mês de cada ano, ordenadas pelo último mês, tente o seguinte:
fonte
Você pode fazer isso simplesmente na função Mysql DATE_FORMAT () no GROUP BY. Você pode adicionar uma coluna extra para maior clareza em alguns casos, como onde os registros abrangem vários anos e o mesmo mês ocorre em anos diferentes. Aqui há tantas opções que você pode personalizar isso. Por favor, leia isto antes de começar. Espero que seja muito útil para você. Aqui está um exemplo de consulta para sua compreensão
fonte
A consulta a seguir funcionou para mim no Oracle Database 12c Release 12.1.0.1.0
fonte
Prefiro otimizar a seleção do grupo de um ano da seguinte forma:
Dessa forma, você pode vincular o ano apenas uma vez, por exemplo
'2009'
, com um parâmetro nomeado e não precisa se preocupar em adicionar'-01-01'
ou passar'2010'
separadamente.Além disso, como presumivelmente estamos apenas contando linhas e
id
não éNULL
, eu prefiroCOUNT(*)
aCOUNT(id)
.fonte
.... 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')
---> MAIO.... group by to_char(date,'YY')
---> 89fonte