Dados los siguientes datos:
id | user_id | started | closed | dead
-------------------------------------------------------------------------------------------
7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL
7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07
13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57
13192 | 259140 | 2015-03-17 10:12:17 | NULL | 2015-03-18 11:46:46
13194 | 259140 | 2015-03-17 10:12:53 | NULL | 2015-03-18 11:46:36
14020 | 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 | NULL
17124 | 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 | NULL
19690 | 238846 | 2015-05-15 13:17:31 | NULL | 2015-05-27 13:56:43
20038 | 242650 | 2015-05-19 15:38:17 | NULL | NULL
20040 | 242650 | 2015-05-19 15:39:58 | NULL | 2015-05-21 12:01:02
20302 | 242650 | 2015-05-21 13:09:06 | NULL | NULL
20304 | 242650 | 2015-05-21 13:09:54 | NULL | NULL
20306 | 242650 | 2015-05-21 13:10:19 | NULL | NULL
20308 | 242650 | 2015-05-21 13:12:20 | NULL | NULL
21202 | 238846 | 2015-05-29 16:47:29 | NULL | NULL
21204 | 238846 | 2015-05-29 16:47:56 | NULL | NULL
21208 | 238846 | 2015-05-29 17:05:15 | NULL | NULL
21210 | 238846 | 2015-05-29 17:05:55 | NULL | NULL
21918 | 242650 | 2015-06-04 17:04:29 | NULL | 2015-06-12 15:47:23
Necesito crear un conjunto de datos que cumpla con las siguientes reglas:
- Los grupos se definen primero por, por
user_id
lo que deberíamos comparar solo registros de la mismauser_id
- Todos los registros que comenzaron al menos dentro de los 15 días de cuando se inició cualquier otro registro, cerrado o muerto, deben contarse como grupo.
- De cada grupo, el final debe calcularse como el primer registro cerrado o todos los registros tienen un valor de muertos y tomamos la fecha más grande de la columna de muertos.
- Si un registro no comenzó dentro de los 15 días posteriores al inicio o al final de otro grupo, entonces comienza una nueva agrupación.
Tentativamente, creo que mis datos deberían verse así:
user_id | comenzó | final -------------------------------------------------- ---- 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 242650 | 2015-05-21 13:09:06 | NULO 238846 | 2015-05-15 13:17:31 | NULO
¿Alguien puede proporcionar alguna orientación sobre cómo crear una consulta para cumplir con estas condiciones?
Aquí hay un enlace a las declaraciones DDL y DML para los datos presentados en esta pregunta.
Alternativamente, podríamos omitir las reglas # 2 y # 4 y más simplemente declarar que solo se deben incluir los registros que se superponen entre sí. La regla más importante es que, en un conjunto dado, si hay una fecha de cierre, se convierte en el final del conjunto y no en la fecha límite más grande.
Respuestas:
Debido a la falta de claridad en la pregunta, se me ocurrieron cuatro soluciones diferentes. Las soluciones difieren en:
Tenga en cuenta que esto se hace en SQL Server, no en MySQL. Aparte de algunos cambios de sintaxis muy menores, debería funcionar igual.
Configuración común y datos de muestra para los cuatro métodos
1. EN CASCADA - UTILIZANDO la solución de REGISTRO CERRADO
Esta es la solución que creo que el autor de la pregunta está buscando y coincide con sus resultados.
2. NO EN CASCADA - UTILIZANDO la solución de REGISTRO CERRADO
Comience calculado por la primera fecha de cierre cuando esté disponible, luego por la fecha de inicio más temprana.
3. NO CASCADING - UTILIZANDO la solución de FECHA ANTERIOR
Inicio calculado solo por la fecha más temprana.
4. EN CASCADA: USO DE LA FECHA ANTERIOR solución
Inicio calculado solo por la fecha más temprana.
fuente
Me preocupa que no tengamos una idea clara de cómo se define un grupo. Solo digo esto porque, dependiendo de algunas condiciones no establecidas, las fechas anteriores formarán un solo grupo gigante o 3 grupos en los que un grupo dominará el conjunto.
¿Faltan condiciones de agrupación?
1) ¿Esta regla de 15 días en cascada? Si un registro
Y
comienza 10 días después de otro registroX
, y luego hay otro registroZ
iniciado 10 días después de eso, ¿esto forma un grupo de tres registrosX,Y,Z
, o dos grupos que contienen cada uno dos registrosX,Y
yY,Z
? Supuse que las reglas de 15 días caen en cascada para formar grupos más grandes.2) ¿Las fechas son inclusivas? Por ejemplo, si un registro tiene una fecha de inicio y luego una fecha límite muchos meses después, ¿se fusionan todos los días dentro de ese rango en el grupo? Trato ambas posibilidades en mi análisis rápido a continuación.
Agrupaciones potenciales
Entonces, si comenzamos con id
7714
, vemos que la fecha de inicio es 1/27. Claramente, la siguiente entrada que7882
comienza el 1/28 cae en este grupo. Sin embargo7882
, tenga en cuenta que termina el 15/5, por lo que todo lo que comienza dentro de los 15 días del 15/05 debe agregarse al grupo.Por lo tanto, a
19690
través de21210
obtener agregado al grupo, que a través de la cascada conduce a21918
ser agregado posteriormente al grupo. La cascada ha consumido casi todas las entradas en el conjunto. Llama a estoGROUP A
.Sin embargo, si la agrupación también incluye la fecha, todas las entradas de
13190
hasta17124
también deben pertenecerGROUP A
, y ahora todos los identificadores están en un solo grupo.Si las fechas de
GROUP A
no están incluidos, pero en realidad se adhieren estrictamente a la '15 días después' regla con cascada, entonces en vez tendría un segundo grupo compuesto por13190
a través14020
, y un tercer grupo con una sola entrada,17124
.Básicamente, mi pregunta es, ¿alguno de estos coincide con su grupo previsto o hay alguna otra información que nos falta en la definición del grupo? Lamento una respuesta tan larga, pero no parece que el resultado solicitado provisionalmente cumpla con su definición de agrupación.
Con aclaraciones, estoy seguro de que podemos solucionar este problema.
fuente