Trouver la plus grande clé qui ne contient pas de données communes

Trouver la plus grande clé qui ne contient pas de données communes - SQL/NoSQL - Programmation

Marsh Posté le 16-09-2020 à 23:41:40    

Salut,
 
Petit problème, même pour le titre je galère, du coup je vais vous donner un exemple.
J'ai une table constituée de 2 colonnes : ID et DATA
ID est numérique, DATA est un varchar.
 
Les données d'exemple sont les suivantes :  
 
ID   -   DATA
1    -   A
1    -   B
1    -   C
2    -   D
2    -   E
2    -   F
3    -   G
4    -   A
4    -   D
4    -   H
5    -   C
5    -   I
5    -   J
6    -   D
7    -   H
7    -   J
 
Mon objectif est de mettre à jour l'ID avec la valeur d'ID la plus grande qui ne contient pas de DATA de l'ID. Par exemple, dans ce cas, l'ID 1 contient A, B, C. Le premier ID qui contient soit A, soit B soit C est l'ID 4, du coup cela signifie que je peux remplacer 1 par 3 et 2 par 3.
De la même façon, je peux remplacer 4 par 5 puisqu'il n'y a pas de données communes entre les ID 4 et 5, idem pour 6 et 7.
(dans la réalité, les ID ne se suivent pas forcément, il peut y avoir des sauts)
 
Aujourd'hui, j'ai cette requête :  
 

Code :
  1. select max(p1.id)
  2. from test p1
  3. where p1.id > 1
  4. and p1.id < (
  5. select min(p3.id) as borne_sup
  6. from test p2
  7. inner join test p3 on p3.data= p2.data and p3.id > p2.id)


 
ce qui revient, pour chaque ligne, à trouver le plus grand ID qui précède le plus petit ID qui contient une DATA commune.
 
Je dois donc faire un curseur, trouver le max inférieur au min commun, mettre à jour, recréer le curseur à partir du min supérieur au dernier max trouvé etc., et la requête n'est pas super performante puisqu'elle parcourt plusieurs fois la table.
 
Je veux aussi garantir l'ordre d'intégration, c'est à dire que je pourrais détecter les ID 1, 2, 3 et 7 comme n'ayant pas de DATA commune, mais comme 4 et 5 ont des données portées par 7, je ne veux pas remplacer 1, 2 et 3 par 7.
 
Je n'ai pas trouvé de moyen de faire le traitement en une seule fois, je ne vois pas trop de mots clés qui pourraient m'aider.
 
Merci,
 
 
 
 

Reply

Marsh Posté le 16-09-2020 à 23:41:40   

Reply

Marsh Posté le 17-09-2020 à 12:29:35    

Y'a moyen de savoir exactement à quoi correspondent ces données (ID et data), svp ? Parce que ta difficulté vient peut-être d'un pb de modélisation des données dans la BD :/
 
Perso, j'ai du mal à comprendre la raison de ce traitement : pourquoi tu dois le faire a posteriori et pourquoi c'est pas fait au moment de la saisie/import ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-09-2020 à 23:15:45    

J'ai vu ton MP. Aujourd'hui, avec le big data, les entreprises ont tendance à conserver toutes leurs data, qu'elles soient structurées ou pas, "au cas où". Avec des BD NoSQL, c'est pas un problème. En effet, avec l'avancée des algos, les entreprises ne savent pas forcément déterminer a priori de quelles données elles vont avoir besoin pour réaliser tel ou tel traitement
 
Avant, avec les SGBDR, on ne gardait que les données qui servaient à faire un traitement clairement identifié (ou plusieurs traitements identifiés). Et dans ce cas, on structurait la BD pour permettre ce ou ces traitements.
 
Si tu cherches du ROI sur l'exploitation de données, je te recommande de lire quelques livres sur le big data et NoSQL ;) Dans la collection Eyrolles, il y en a de très bons.
https://www.amazon.fr/bases-données [...] 00WTGK4HC/
https://www.amazon.fr/Data-science- [...] 212142439/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed