Dados os seguintes dados:
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
Preciso criar um conjunto de dados que atenda às seguintes regras:
- Os grupos são definidos primeiro por,
user_id
portanto, devemos comparar apenas registros da mesmauser_id
- Todos os registros iniciados pelo menos 15 dias após o início de qualquer outro registro, fechado ou morto devem ser contados como grupo.
- Para cada grupo, o final deve ser calculado como o primeiro registro fechado ou todos os registros têm um valor como morto e usamos a maior data da coluna morta.
- Se um registro não iniciar dentro de 15 dias após o início ou o fim de outro grupo, ele iniciará um novo agrupamento.
Como tentativa, acredito que meus dados devem ficar assim:
user_id | iniciado | fim -------------------------------------------------- ---- 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
Alguém pode fornecer alguma orientação sobre como criar uma consulta para atender a essas condições?
Aqui está um link para as instruções DDL e DML para os dados apresentados nesta pergunta.
Como alternativa, podemos pular as regras 2 e 4 e, mais simplesmente, declarar que apenas os registros que se sobrepõem devem ser incluídos. A regra mais importante é que, em um determinado conjunto, se houver uma data fechada, esse se tornará o final do conjunto e não o maior prazo final.
Respostas:
Devido à falta de clareza na pergunta, criei quatro soluções diferentes. As soluções diferem em:
Observe que isso é feito no SQL Server, não no MySQL. Além de algumas alterações muito pequenas na sintaxe, deve funcionar da mesma maneira.
Dados comuns de configuração e de amostra para todos os quatro métodos
1. CASCADING - USANDO A SOLUÇÃO FECHADA DE REGISTROS
Esta é a solução que acredito que o solicitante está procurando e corresponde aos seus resultados.
2. NÃO-CASCADING - USANDO A SOLUÇÃO FECHADA
O início é calculado pela primeira data de fechamento, quando disponível, e pela data de início mais antiga.
3. NÃO CASCADING - USANDO A SOLUÇÃO DE DATA MAIS ANTIGA
Início calculado apenas pela data mais antiga.
4. CASCADING - USANDO A SOLUÇÃO MAIS ANTIGA DATA
Início calculado apenas pela data mais antiga.
fonte
Estou preocupado que possamos não ter uma imagem clara de como um grupo é definido. Só digo isso porque, dependendo de algumas condições não declaradas, as datas acima formarão um único grupo gigante ou três grupos em que um grupo domina o conjunto.
Faltam condições de agrupamento?
1) Essa regra de 15 dias fica em cascata? Se um registro
Y
iniciar 10 dias após outro registroX
e houver outro registroZ
iniciado 10 dias depois, ele formará um grupo de três registrosX,Y,Z
ou dois grupos, cada um contendo dois registrosX,Y
eY,Z
? Eu assumi que as regras de 15 dias se conectam em cascata para formar grupos maiores.2) As datas são inclusivas? Por exemplo, se um registro tiver uma data de início e uma data final muitos meses depois, todos os dias nesse intervalo serão mesclados ao grupo? Trato as duas possibilidades em minha análise rápida abaixo.
Agrupamentos potenciais
Portanto, se começarmos com id
7714
, veremos que a data de início é 1/27. Claramente, a próxima entrada a7882
partir de 1/28 se enquadra nesse grupo. Observe, no entanto, que7882
termina em 15/5, portanto, qualquer coisa que comece dentro de 15 dias a partir de 15/5 deve ser adicionada ao grupo.Assim,
19690
por meio de21210
adição ao grupo, que via cascata leva a21918
ser adicionado posteriormente ao grupo. A cascata consumiu quase todas as entradas do conjunto. Ligue para issoGROUP A
.No entanto, se o agrupamento incluir também a data, todas as entradas de
13190
até17124
também deverão pertencerGROUP A
e agora todos os IDs estarão em um único grupo.Se as datas de
GROUP A
não forem inclusivas, mas realmente seguirem estritamente a regra '15 dias depois 'com cascata, você terá um segundo grupo composto por13190
through14020
e um terceiro grupo com uma única entrada17124
,.Essencialmente, minha pergunta é: alguma delas corresponde ao seu agrupamento pretendido ou há alguma outra informação que está faltando na definição do grupo? Sinto muito por uma resposta tão demorada, mas não parece que sua tentativa de saída solicitada atenda à sua definição de agrupamento.
Com esclarecimentos, tenho certeza de que podemos resolver esse problema.
fonte