Pregunta

En realidad, ni siquiera sé cómo llamar a esto: P, pero ...

Tengo una tabla, vamos a llamarlo "subidas"

id    owner    date
-----------------------------
0     foo      20100101120000
1     bar      20100101120300
2     foo      20100101120400
3     bar      20100101120600
..    ..       ..
6     foo      20100101120800

Ahora, cuando I'ld hacer algo como:

SELECT id FROM uploads ORDER BY date DESC

Esto resultaría en:

id    owner    date
-----------------------------
6     foo      20100101120800
..    ..       ..
3     bar      20100101120600
2     foo      20100101120400
1     bar      20100101120300
0     foo      20100101120000

Pregunta: Niza, pero, quiero ir aún más lejos. Porque ahora, cuando se construiría una línea de tiempo (y lo hice: P), que son 'spam' por mensajes diciendo foo y BAR subido algo. I'ld como para agruparlos y devolver el primer resultado con un plazo de '500' en el campo de la fecha.

¿Qué tipo de SQL mando necesito que se traduciría en:

id    owner    date
-----------------------------
6     foo      20100101120800
3     bar      20100101120600
0     foo      20100101120000

A continuación, después de eso, puede realizar una llamada para cada registro para obtener los registros asociativos en un plazo de 5 minutos (esto es una exmaple de id = 6):

SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC

¿alguien ahora cómo debería hacer el primer paso? (Limitando así / la agrupación de los resultados)

(por cierto. Yo sé que cuando quiero usar esto, yo debería convertir cada cita (YmdHis = 60) para Unix-tiempo (= 100), pero no necesito los 5 minutos a ser exactamente 5 minutos, pueden ser un minuto menos a veces ...)

¿Fue útil?

Solución

No estoy muy claro en el resultado que se está tratando de conseguir, incluso con sus ejemplos. Tal vez algo con redondeo y por grupo.

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner

Es posible que desee utilizar suelo o el techo en lugar de REDONDO, dependiendo de lo que desee.

Otros consejos

estándar SQL no se ocupa de intervalos muy bien. Usted va a tener que hacer un auto-unión de la tabla para comparar las fechas de las diferentes tuplas. De esta manera, usted puede encontrar fácilmente todos los pares de tuplas de las cuales son las fechas no más de 500 pedazos. Sin embargo, usted realmente desea agrupar las fechas en conjuntos de no más de 500 aparte - y que no se puede expresar en SQL en absoluto, por lo que yo sé

.

Lo que puede hacer es algo bastante similar: dividir el intervalo de tiempo total en rangos de 500 unidades fijas, y luego se agrupan todas las tuplas de la tabla en función del intervalo que están en Para eso, es necesario en primer lugar una mesa o. resultado de la consulta con las horas de inicio de los intervalos; Esto puede ser creado mediante una consulta SQL en su mesa y una función que sea "redondea" una marca de tiempo a la hora de inicio de su intervalo, o calcula su número de secuencia de intervalos. A continuación, como segundo paso que puede unirse a la mesa con ese resultado al grupo de sus marcas de tiempo en función de su hora de inicio correspondiente. No puedo dar el SQL porque es DBMS-dependiente, y desde luego no se puede saber si esta es la mejor manera de lograr lo que quiere en su situación.

Usar una vista en línea? p.ej. algo así como

SELECT u1.* 
FROM uploads u1,
(SELECT date 
    FROM uploads u2
    WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
    AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)

debería devolver todos los mensajes hechos dentro de los 5 minutos de 'foo' incluir un anuncio.

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