Sql дата выбрать строки в диапазоне X секунд друг от друга

StackOverflow https://stackoverflow.com/questions/839036

  •  22-07-2019
  •  | 
  •  

Вопрос

Моя таблица 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 - это количество секунд в вашем временном интервале.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top