Pregunta

Tengo una tabla MySQL con aproximadamente 3000 filas por el usuario.Una de las columnas es un campo datetime, que es mutable, por lo que las filas no están en orden cronológico.

Me gustaría visualizar la distribución del tiempo en un gráfico, por lo que necesito un número de puntos de datos individuales.20 puntos de datos sería suficiente.

Yo podría hacer esto:

select timefield from entries where uid = ? order by timefield;

y mire todas las 150 fila.

O yo podría hacer 20 consultas por separado y utilizar limit 1 y offset.

Pero debe haber una solución más eficiente...

¿Fue útil?

Solución

Michal Sznajder casi lo tenía, pero no puede usar los alias de columna en una cláusula where en SQL.Así que usted tiene que envuelve como una tabla derivada.He intentado esto y se devuelve 20 filas:

SELECT * FROM (
    SELECT @rownum:=@rownum+1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;

Otros consejos

Algo como esto vino a mi mente

select @rownum:=@rownum+1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0

No tengo MySQL en mi mano, pero tal vez esto ayude ...

Tan lejos como la visualización, sé que este no es el muestreo periódico de las que están hablando, pero me gustaría ver a todos de las filas de un usuario y elija un intervalo de cubo, que SUMA dentro de los baldes y mostrar en un gráfico de barras o similar.Esto mostraría un verdadero "distribución", ya que muchas de las apariciones dentro de un marco de tiempo puede ser significativo.

SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket -- choose an appropriate granularity (days used here)
     ,COUNT(*)
FROM entries
WHERE uid = ?
GROUP BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)
ORDER BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)

O si no te gusta la forma en que usted tiene que repetir, o si usted está jugando con cubos diferentes y desea analizar a través de muchos usuarios en 3-D (medida en Z contra x, y uid, cubo):

SELECT uid
    ,bucket
    ,COUNT(*) AS measure
FROM (
    SELECT uid
        ,DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket
    FROM entries
) AS buckets
GROUP BY uid
    ,bucket
ORDER BY uid
    ,bucket

Si quería parcela en 3-D, probablemente sería determinar un camino a fin de que los usuarios de acuerdo a algunos significativos general de métricas para el usuario.

@Michal

Por la razón que sea, su ejemplo sólo funciona cuando el donde @recnum utiliza un operador menor que.Creo que cuando la donde se filtra una fila, el rownum no consigue incrementa, y no puede coincidir con cualquier otra cosa.

Si la tabla original tiene un auto incrementa id de columna y filas que se han insertado en orden cronológico, entonces esto debería funcionar:

select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;

Por supuesto que no funciona si no hay correlación entre el id y la fecha, a menos que usted realmente no importa obtener espaciados uniformemente timefields, a sólo 20 azar queridos.

¿Realmente la atención acerca de los puntos de datos individuales?O ¿el uso de la estadística las funciones de agregado en el número de día en lugar suficiente para decirle lo que usted quiere saber?

select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

No es una base de datos mysql experto así que no estoy seguro de cómo rand() opera en este entorno.

Para mi la referencia y el uso de postgres - Postgres 9.4 se han ordenado conjunto de agregados que debe resolver este problema:

SELECT percentile_disc(0.95) 
WITHIN GROUP (ORDER BY response_time) 
FROM pageviews;

Fuente: http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top