Compte tenu des données suivantes:
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
J'ai besoin de créer un ensemble de données qui respecte les règles suivantes:
- Les groupes sont définis en premier par
user_id
donc nous devons comparer uniquement les enregistrements de la mêmeuser_id
- Tous les enregistrements qui ont commencé au moins dans les 15 jours suivant le début, la fermeture ou la mort de tout autre enregistrement doivent être comptés comme groupe.
- Pour chaque groupe, la fin doit être calculée comme le premier enregistrement fermé ou tous les enregistrements ont une valeur pour dead et nous prenons la plus grande date de la colonne dead.
- Si un enregistrement n'a pas commencé dans les 15 jours suivant le début ou la fin d'un autre groupe, il commence alors un nouveau regroupement.
À titre provisoire, je pense que mes données devraient ressembler à ceci:
user_id | commencé | fin -------------------------------------------------- ---- 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 | 16/04/2015 16:19:08 | 16/04/2015 16:21:06 242650 | 2015-05-21 13:09:06 | NUL 238846 | 15/05/2015 13:17:31 | NUL
Quelqu'un peut-il fournir des conseils sur la façon de créer une requête pour répondre à ces conditions?
Voici un lien vers les instructions DDL et DML pour les données présentées dans cette question.
Alternativement, nous pourrions ignorer les règles # 2 et # 4 et plus simplement déclarer que seuls les enregistrements qui se chevauchent devraient être inclus. La règle la plus importante est que dans un ensemble donné, s'il y a une date de clôture, cela devient la fin de l'ensemble et non la plus grande date morte.
Réponses:
En raison du manque de clarté de la question, j'ai trouvé quatre solutions différentes. Les solutions diffèrent sur:
Veuillez noter que cela se fait dans SQL Server, pas dans MySQL. À part quelques changements de syntaxe très mineurs, cela devrait fonctionner de la même manière.
Configuration commune et exemples de données pour les quatre méthodes
1. CASCADING - UTILISATION de la solution CLOSED RECORD
C'est la solution que je crois que le demandeur recherche et correspond à ses résultats.
2. NON CASCADING - UTILISATION DE LA SOLUTION D'ENREGISTREMENT FERMÉ
Début calculé par la première date de clôture lorsqu'elle est disponible, puis par la première date de début.
3. NON CASCADING - UTILISATION DE LA SOLUTION DATE LA PLUS TÔT
Début calculé uniquement au plus tôt.
4. CASCADING - UTILISATION de la solution DATE LA PLUS TÔT
Début calculé uniquement au plus tôt.
la source
Je crains que nous n'ayons pas une idée claire de la façon dont un groupe est défini. Je dis seulement cela parce que, selon certaines conditions non déclarées, les dates ci-dessus formeront soit un seul groupe géant, soit 3 groupes où un groupe domine l'ensemble.
Conditions de regroupement manquantes?
1) Cette règle des 15 jours est-elle en cascade? Si un enregistrement
Y
commence 10 jours après un autre enregistrementX
, et puis il y a un autre enregistrementZ
démarré 10 jours après cela, alors cela forme-t-il un groupe de trois enregistrementsX,Y,Z
, ou deux groupes contenant chacun deux enregistrementsX,Y
etY,Z
? J'ai fait l'hypothèse que les règles de 15 jours tombent en cascade pour former des groupes plus importants.2) Les dates sont-elles incluses? Par exemple, si un enregistrement a une date de début puis une date morte plusieurs mois plus tard, tous les jours de cette plage sont-ils fusionnés dans le groupe? Je traite les deux possibilités dans mon analyse rapide ci-dessous.
Groupements potentiels
Donc, si nous commençons par id
7714
, nous voyons que la date de début est 1/27. De toute évidence, la prochaine entrée à7882
partir du 1/28 appartient à ce groupe. Notez cependant que cela7882
se termine le 5/15, donc tout ce qui commence dans les 15 jours du 5/15 doit être ajouté au groupe.Ainsi,
19690
grâce à21210
être ajouté au groupe, ce qui, via la cascade, conduit à21918
être ajouté ultérieurement au groupe. La cascade a consommé presque toutes les entrées de l'ensemble. Appelez çaGROUP A
.Si, toutefois, le regroupement inclut également la date, toutes les entrées de
13190
jusqu'à17124
doivent également appartenir àGROUP A
, et maintenant tous les identifiants sont dans un seul groupe.Si les dates de
GROUP A
ne sont pas inclus, mais en fait respecter strictement la journée '15 après » règle avec cascade, puis à la place que vous avez un deuxième groupe composé de13190
travers14020
, et un troisième groupe avec une seule entrée,17124
.Essentiellement, ma question est la suivante: est-ce que l'un de ces éléments correspond à votre regroupement prévu ou y a-t-il d'autres informations qui nous manquent dans la définition du groupe? Je suis désolé pour une réponse aussi longue, mais il ne semble pas que votre sortie demandée provisoire réponde à votre définition de regroupement.
Avec des clarifications, je suis sûr que nous pouvons régler ce problème.
la source