Sql дата выбрать строки в диапазоне X секунд друг от друга
Вопрос
Моя таблица sql похожа на (сообщение, создано)
Я хочу выбрать те строки, которые находятся в пределах X секунд друг от друга. Скажем, последнее сообщение в течение X секунд от NOW (), затем оно должно выбрать его. Если второе последнее сообщение находится в пределах X секунд от последнего сообщения, оно также должно выбрать его. Другими словами, каждый ряд должен сравниваться со следующим и проверяться. Для последнего ряда это должно быть проверено, скажем, NOW (). По сути, я хочу последний сеанс сообщений (то есть последний набор сообщений, которые мы связали друг с другом, предполагая, что последовательные сообщения в течение X секунд связаны друг с другом)
Я понятия не имею, как написать SQL-запрос для этого. Это вообще возможно?
Большое спасибо за ваше время.
Решение
Этот скрипт работает в SQLServer. Вы должны быть в состоянии извлечь оператор select и запустить его в 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
Другие советы
Я полагаю, что вы думаете слишком сложно (но опять же, может быть, я неправильно понял требование?)
Выбирает все сообщения, созданные за 30 секунд до определенного сообщения:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
где 17 - это, конечно, идентификатор сообщения, который вас интересует, а 30 - это количество секунд в вашем временном интервале.