Pregunta

Tengo una tabla que contiene datos grabados cada minuto, así que tengo una fila por cada minuto. Al devolver los datos para el procesamiento, se requiere esta precisión durante las últimas 6 horas, pero después de eso, un nivel de precisión más bajo es suficiente, p. cada 5 minutos.

Puedo devolver todos los datos en una matriz y luego eliminar todos los elementos, excepto cada quinto, pero eso requiere que MySQL devuelva todos los datos y luego leerlos primero en la matriz, una gran cantidad de datos.

¿Cómo puedo devolver cada enésima fila en MySQL? He leído esta publicación de blog que sugiere usar primaryKey% 5 = 0 donde primaryKey es auto_increment pero esto

a) no usa índices b) solo devolverá los valores de PrimaryKey que son divisibles por 5 y, en el caso de eliminaciones, puede que no sea cada 5ta fila

¿Se puede hacer esto dentro de la consulta SQL o requerirá recorrer fila por fila a través del conjunto de resultados usando cursores?

Estoy usando MySQLi en PHP para conectarme a la base de datos.

¿Fue útil?

Solución

La lista de marcas de tiempo cada 5 minutos:

SELECT
  MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
  DATE(logtimestamp),
  HOUR(logtimestamp),
  MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)

Ahora, puede usar esto como una sub-selección para obtener las entradas de registro solicitadas uniendo logtimestamps a first_of_five_minutes en el. Por supuesto, las cláusulas WHERE adicionales deben replicarse por dentro y por fuera para que obtenga & Quot; right & Quot; marcas de tiempo.

Además, tenga en cuenta que esto devuelve la primera marca de tiempo en cada intervalo de cinco minutos, mientras que las soluciones que usan directamente minutes%5 = 0 solo devuelven logentries que en realidad están en múltiplos de: 05, que pueden fallar si tiene retrasos en la grabación de registros o similar .

Otros consejos

completamente no probado pero esto podría funcionar

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top