Data SQL selezionare le righe entro un intervallo di X secondi l'una dall'altra
Domanda
La mia tabella sql è qualcosa di simile (messaggio, creato)
Voglio selezionare quelle righe che si trovano entro X secondi l'una dall'altra. Supponiamo che l'ultimo messaggio sia entro X secondi da NOW (), quindi dovrebbe selezionarlo. Se il secondo ultimo messaggio si trova entro X secondi dall'ultimo messaggio, dovrebbe selezionarlo anche. In altre parole, ogni riga deve essere confrontata con la riga successiva e verificata. Per l'ultima riga dovrebbe essere verificato con dire ORA (). Fondamentalmente voglio l'ultima sessione di messaggi (ovvero l'ultima serie di messaggi che abbiamo collegato tra loro, supponendo che i messaggi consequtivi entro X secondi siano collegati tra loro)
Non ho idea di come scrivere una query SQL per questo. È anche possibile?
Grazie mille per il tuo tempo.
Soluzione
Questo script funziona in SQLServer. Dovresti essere in grado di estrarre l'istruzione select ed eseguirla in 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
Altri suggerimenti
Credo che tu stia pensando troppo complicato (Ma poi di nuovo, forse ho frainteso il requisito?)
Seleziona tutti i messaggi creati entro 30 secondi prima di un determinato messaggio:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
dove 17 è ovviamente il messaggio ID che ti interessa e 30 è il numero di secondi nel tuo intervallo di tempo.