Hello,
J'ai besoin de votre cerveau pour résoudre un problème.
Le contexte : j'importe dans une collection des données avec des dates de début et de fin, voici le schéma :
Les périodes de dates (start_at et end_at) pour un utilisateur (user_id) et un indicateur (indicator_id) peuvent se chevaucher, par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 user_id : int indicator_id : int start_at : int end_at : int result : float
Import N°1
Import N°2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 start_at = 01-01-2017 end_at = 05-01-2017
Import N°3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 start_at = 02-01-2017 end_at = 04-01-2017
Mon problème : Je dois pouvoir récupérer les données pour un utilisateur et un indicateur, sur une période, sans que les dates ne se chevauchent, mais je dois récupérer le groupe de données ou les périodes ont le plus de jours cumulés, exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 start_at = 06-01-2017 end_at = 10-01-2017
On peut grouper les 3 imports de cette manière :
- Import N°1 et N°3 : du 1 au 5 puis du 6 au 10, pour un total de 10 jours
- Import N°2 et N°3 : du 2 au 4 puis du 6 au 10, pour un total de 8 jours
On est donc censé récupérer les imports N°1 et 3 car c'est eux qui comportent le plus de jours au cumule.
Je débute en MongoDB, je n'ai pas encore toutes les connaissances requises pour trouver la bonne requête, si elle existe. J'ai pensé à faire un MapReduce qui serait la meilleur solution, pour pouvoir créer une collection ou on a une ligne pour un utilisateur, un indicateur et les lignes d’import correspondant.
Il y a l'algorithme X de Knuth qui peut partiellement régler le problème mais ça ne règle pas le problème puisque cet algorithme permet de trouver la bonne solution pour COUVRIR entièrement une période.
Une idée ?
Partager