Tenho algumas dificuldades com os comandos mySQL que desejo executar.
SELECT a.timestamp, name, count(b.name)
FROM time a, id b
WHERE a.user = b.user
AND a.id = b.id
AND b.name = 'John'
AND a.timestamp BETWEEN '2010-11-16 10:30:00' AND '2010-11-16 11:00:00'
GROUP BY a.timestamp
Esta é minha declaração de saída atual.
timestamp name count(b.name)
------------------- ---- -------------
2010-11-16 10:32:22 John 2
2010-11-16 10:35:12 John 7
2010-11-16 10:36:34 John 1
2010-11-16 10:37:45 John 2
2010-11-16 10:48:26 John 8
2010-11-16 10:55:00 John 9
2010-11-16 10:58:08 John 2
Como faço para agrupá-los em resultados de intervalo de 5 minutos?
Eu quero que minha saída seja como
timestamp name count(b.name)
------------------- ---- -------------
2010-11-16 10:30:00 John 2
2010-11-16 10:35:00 John 10
2010-11-16 10:40:00 John 0
2010-11-16 10:45:00 John 8
2010-11-16 10:50:00 John 0
2010-11-16 10:55:00 John 11
Respostas:
Isso funciona com todos os intervalos.
PostgreSQL
MySQL
fonte
Eu me deparei com o mesmo problema.
Descobri que é fácil agrupar por qualquer intervalo de minuto, basta dividir a época por minutos em quantidade de segundos e, em seguida, arredondar ou usar o chão para se livrar do restante. Portanto, se você quiser obter o intervalo em 5 minutos, deverá usar 300 segundos .
Isso retornará os dados agrupados corretamente pelo intervalo de minutos selecionado; no entanto, ele não retornará os intervalos que não contêm dados. Para obter esses intervalos vazios, podemos usar a função generate_series .
Resultado:
Agora, para obter o resultado com intervalo com zero ocorrências, apenas juntamos os dois conjuntos de resultados .
O resultado final incluirá a série com todos os intervalos de 5 minutos, mesmo aqueles que não têm valores.
O intervalo pode ser facilmente alterado ajustando o último parâmetro de generate_series. No nosso caso, usamos '5m', mas pode ser qualquer intervalo que quisermos.
fonte
Você deve preferir usar em
GROUP BY UNIX_TIMESTAMP(time_stamp) DIV 300
vez de arredondar (../ 300) por causa do arredondamento que descobri que alguns registros são contados em dois conjuntos de resultados agrupados.fonte
DIV
no MySQL é umafloor()
divisão de float que é segura comBIGINT
s.Para postgres , achei mais fácil e preciso usar o
date_trunc
função, como:
Você pode fornecer várias resoluções como 'minuto', 'hora', 'dia' etc ... até date_trunc.
fonte
5
aqui para o intervalo de 5 minutos?A consulta será algo como:
fonte
Você provavelmente terá que dividir seu carimbo de data / hora em ymd: HM e usar DIV 5 para dividir os minutos em caixas de 5 minutos - algo como
... e, em seguida, futz a saída no código do cliente para aparecer da maneira que você gosta. Ou você pode construir toda a string de data usando o operador sql concat em vez de obter colunas separadas, se desejar.
... e então agrupar nisso
fonte
Não tenho certeza se você ainda precisa disso.
fonte
Que tal este:
fonte
Descobri que com o MySQL provavelmente a consulta correta é a seguinte:
Diz-me o que pensas.
fonte
fonte