Sql дата выбрать строки в диапазоне X секунд друг от друга - PullRequest
6 голосов
/ 08 мая 2009

Моя таблица sql похожа на (сообщение, создано)

Я хочу выбрать те строки, которые находятся в пределах X секунд друг от друга. Скажем, последнее сообщение в течение X секунд от NOW (), затем оно должно выбрать его. Если второе последнее сообщение находится в пределах X секунд от последнего сообщения, оно также должно выбрать его. Другими словами, каждый ряд должен сравниваться со следующим и проверяться. Для последнего ряда это должно быть проверено, скажем, NOW (). По сути, я хочу последний сеанс сообщений (т.е. последний набор сообщений, которые мы связали друг с другом, при условии, что последовательные сообщения в течение X секунд связаны друг с другом)

Я понятия не имею, как написать SQL-запрос для этого. Это вообще возможно?

Большое спасибо за ваше время.

Ответы [ 2 ]

6 голосов
/ 08 мая 2009

Этот скрипт работает в 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
0 голосов
/ 08 мая 2009

Я полагаю, что вы думаете слишком сложно (но опять же, может быть, я неправильно понял требование?)

Выбирает все сообщения, созданные за 30 секунд до определенного сообщения:

SELECT
  Id,
  MessageText,
  MessageDate
FROM
  Message
WHERE
  TIME_TO_SEC(TIMEDIFF(
    (
      SELECT MessageDate 
      FROM   Message
      WHERE  Id = 17
    ),
    MessageDate
  )) <= 30

где 17 - это, конечно, интересующее вас сообщение, а 30 - количество секунд в вашем таймфрейме.

...