2008-08-06 8 views
11

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

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ían suficientes.

que podía hacer esto:

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

y buscar en cada fila 150a.

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

Pero tiene que haber una solución más eficiente ...

+0

puede describir la cuestión un poco más? ¿Cuál es el resultado que estás buscando? ¿Desea ver un gráfico de frecuencia (por ejemplo, el número de entradas en enero = 132, febrero = 112, marzo = 173, etc.), o desea los valores individuales de la entrada más temprana, la entrada número 150 más temprana, la 300ª, etc? – nickf

Respuesta

6

Michal Sznajder casi lo tenía, pero no se pueden usar alias de columna en una cláusula WHERE en SQL. Entonces debes envolverlo como una tabla derivada. He intentado esto y devuelve 20 filas:

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

Algo como esto vino a mi mente

select @rownum:[email protected]+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 ...

0

@Michal

Por alguna razón, su ejemplo sólo funciona cuando el @recnum donde utiliza una menos de operador. Creo que cuando el lugar filtra una fila, el Rownum no se incrementa, y no puede coincidir con nada más.

Si la tabla original tiene una columna de identificación automática incrementado, y las filas se insertaron 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 existe una correlación entre el ello y el campo de tiempo, a menos que realmente no te importe obtener campos de tiempo espaciados uniformemente, solo 20 aleatorios.

0

¿Realmente le importan los puntos de datos individuales? ¿O bastará con usar las funciones agregadas estadísticas en el número del día para decirle lo que desea saber?

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

un experto en MySQL así que no estoy seguro de cómo rand() opera en este entorno.

+0

que debería ser "rand() <.01" – nickf

1

En cuanto a la visualización, sé que esto no es el muestreo periódico que está hablando, pero me gustaría ver todas las filas de un usuario y seleccione un cubo de intervalo , SUMA dentro de los cubos y muestra en un gráfico de barras o similar. Esto mostraría una "distribución" real, ya que muchas ocurrencias dentro de un marco de tiempo pueden ser significativas.

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 tiene que repetir a sí mismo - o si usted está jugando con diferentes cubos y desea analizar a través de muchos usuarios en 3-D (medida en contra de Z 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 trazar en 3-D, probablemente habría determinar una manera de ordenar los usuarios de acuerdo a alguna métrica global significativo para el usuario.

+0

¿se puede hacer "GROUP BY cubo ORDER BY cubo"? parece que sería mucho más eficiente (no tener que volver a calcular esa columna cada vez) – nickf

+0

No, no puede, sin embargo, el optimizador no vuelve a calcular esas expresiones, porque sabe que las funciones son deterministas. –

Cuestiones relacionadas