El caso es complicado y requiere sentencias anidadas de varios niveles. si no quieres resolverlo por medio de un store procedure.
Primero tienes que lograr agrupar los registros de inicio y fin del cálculo, es decir, un mismo registro conteniendo el horario anterior y el siguiente de conexion, de modo que se agrupen uno a uno:
Código sql:
Ver originalSELECT
ORIGEN, DESTINO, PORIG, PDEST, SID, INI, FIN
FROM
(SELECT
IP_origen ORIGEN,
IP_destino DESTINO,
s1.puerto_o PORIG,
s1.puerto_d PDEST,
sid SID,
s1.hora INI
s2.hora FIN
FROM tu_tabla s1 INNER JOIN tu_tabla s2
USING (IP_origen, IP_destino, sid)
WHERE s1.hora<s2.hora AND s1.sid=3
ORDER BY s1.IP_origen, s2.hora ASC) T1
GROUP BY ORIGEN, SID, FIN;
El agrupamiento hace desaparecer los registros no validos.
Luego hay que hacer el verdadero cálculo, es decir, que te devuelva los datos de los registros cuya diferencia de tiempos es de cinco minutos, y que además se hayan hecho al menos cuatro intentos:
Código sql:
Ver originalSELECT ORIGEN, PORIG, PDEST, SID
FROM (
SELECT
ORIGEN, DESTINO, PORIG, PDEST, SID, INI, FIN
FROM
(SELECT
IP_origen ORIGEN,
IP_destino DESTINO,
s1.puerto_o PORIG,
s1.puerto_d PDEST,
sid SID,
s1.hora INI
s2.hora FIN
FROM tu_tabla s1 INNER JOIN tu_tabla s2
USING (IP_origen, IP_destino, sid)
WHERE s1.hora<s2.hora AND s1.sid=3
ORDER BY s1.IP_origen, s2.hora ASC) T1
GROUP BY ORIGEN, SID, FIN) T2
WHERE MINUTE(TIMEDIFF(INI,FIN))>=5
GROUP BY ORIGEN
HAVING COUNT(*)>=4;
Aclaro que lo estoy reconstruyendo sobre la base de casos que he programado antes, pero que de todos modos hay que ir probando las selecciones de a una, desde adentro hacia afuera.
Como no tengo los datos ni la estructura, no he podido comprobarlo, pero el esquema es esencialmente correcto. Si hay errores estarán en los ordenamientos intermedios o los campos de agrupación.