Fila de selección de fecha SQL dentro del rango de X segundos entre sí
Pregunta
Mi tabla sql es algo así como (mensaje, creado)
Quiero seleccionar esas filas que están dentro de X segundos entre sí. Digamos que el último mensaje está dentro de X segundos desde AHORA (), luego debería seleccionarlo. Si el segundo último mensaje está dentro de X segundos desde el último mensaje, entonces también debería seleccionarlo. En otras palabras, cada fila debe compararse con la siguiente fila y comprobarse. Para la última fila se debe verificar con say NOW (). Básicamente quiero la última sesión de mensajes (es decir, el último conjunto de mensajes que vinculamos entre sí, suponiendo que los mensajes consecutivos dentro de X segundos estén vinculados entre sí)
No tengo idea de cómo escribir una consulta SQL para esto. ¿Es posible?
Muchas gracias por su tiempo.
Solución
Este script funciona en SQLServer. Debería poder sacar la instrucción select y ejecutarla en MySQL.
DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
DECLARE @Interval FLOAT
-- Interval is 1 day.
SET @Interval = 1
-- These should be in result
INSERT INTO @Messages VALUES ('Message1', GetDate())
INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
-- These should not be in result
INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
INSERT INTO @Messages VALUES ('Message4', GetDate()-5)
SELECT m1.Message, m1.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
UNION ALL SELECT m2.Message, m2.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
ORDER BY Created
Otros consejos
Creo que estás pensando demasiado complicado (Pero, de nuevo, ¿tal vez entendí mal el requisito?)
Esto selecciona todos los mensajes creados dentro de los 30 segundos anteriores a un mensaje en particular:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
donde 17 es, por supuesto, la identificación del mensaje que le interesa, y 30 es el número de segundos en su marco de tiempo.