Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contando todas as linhas com colunas específicas e agrupando por semana


Sua consulta não é determinística, portanto, não é surpreendente que você esteja obtendo resultados inesperados. Com isso quero dizer que você pode executar essa consulta nos mesmos dados 5 vezes e obter 5 conjuntos de resultados diferentes. Isso se deve ao fato de você estar selecionando DATE(timestamp) mas agrupando por WEEK(DATE(startdate)) , a consulta está, portanto, retornando a hora da primeira linha encontrada por semana de data de início em QUALQUER ordem.

Considere as 2 linhas a seguir (com carimbo de data/hora no formato de data para facilitar a leitura):
TimeStamp       StartDate
20120601        20120601
20120701        20120601

Sua consulta está agrupada por WEEK(StartDate) que é 23, já que ambas as linhas são avaliadas com o mesmo valor, você esperaria que seus resultados tivessem 1 linha com uma contagem de 2.

ENTÃO DATE(Timestamp) Também está na lista de seleção e como não há ORDER BY declaração, a consulta não tem ideia de qual carimbo de data/hora retornar '20120601' ou '20120701'. Portanto, mesmo neste pequeno conjunto de resultados, você tem uma chance de 50:50 de obter:
TimeStamp       COUNT
20120601        2

e uma chance de 50:50 de obter
TimeStamp       COUNT
20120701        2

Se você adicionar mais dados ao conjunto de dados assim:
TimeStamp       StartDate
20120601        20120601
20120701        20120601
20120701        20120701

Você poderia obter
TimeStamp       COUNT
20120601        2
20120701        1

ou
TimeStamp       COUNT
20120701        2
20120701        1

Você pode ver como, com 37.000.000 de linhas, em breve você obterá resultados que não espera e não pode prever!

EDITAR

Como parece que você está tentando obter o início da semana em seus resultados, enquanto agrupa por semana, você pode usar o seguinte para obter o início da semana (substituindo CURRENT_TIMESTAMP pela coluna desejada):
SELECT  DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart

Você também pode agrupar por essa data para obter resultados semanais e evitar o problema de ter coisas na sua lista de seleção que não estão no seu grupo.