0
votes

Données divisées pour un groupe égal (PL / SQL, SQL)

J'ai le nombre d'identifiants: xxx pré>

Je sais que j'ai totalement total_user = 109 code> (nombre d'enregistrements). Donc, je veux le scinder au groupe égal: p> xxx pré>

donc j'ai 4 groupe code>. Dans le les trois premiers sera 27 code> et Dernier doit être 28 code> utilisateurs. P>

maintenant je veux pour chaque groupe code> Attribuer L'ID unique. P>

set serveroutput on 
declare 
      CURSOR cur IS Select * From table_U FOR UPDATE OF USER_ID;
      mapUser NUMBER;
      l_rec table_U%rowtype;
      x_mapUser Number := 0;--number between 0-27
      c_obj_id NUMBER := 1;
      count_id NUMBER := 0;

      type T1 is table of number(10) index by binary_integer;
      V1 T1;    

begin
     Select count(*) Into count_id From table_I;--count_id = 4
     Select round(count(*)/count_id,0) Into mapUser From table_U; --mapUser = 27

     SELECT id BULK COLLECT INTO V1 FROM table_I;--it's 4 id (id_1, id_2, id_3, id_4)

    OPEN cur;
        LOOP FETCH cur INTO l_rec;
         EXIT WHEN cur%notfound;

           IF x_mapUser > mapUser Then --0-27 > 27
                x_mapUser := 1;                   
                c_obj_id := c_obj_id +1;--next value from V1
           End if;

          UPDATE table_U SET USER_ID = V1(c_obj_id) WHERE CURRENT OF cur;

         x_mapUser := x_mapUser +1;

        END LOOP;
       CLOSE cur;        
end;


1 commentaires

Les échantillons de données et les résultats souhaités sont vraiment une grande aide.


3 Réponses :


1
votes

J'utiliserais Ntile () Code> :

select u.*, row_number() over (partition by grp order by grp) as seqnum
from (select u.*, ntile(4) over (order by user_id) as grp
      from table_u u
     ) u;


1 commentaires

OK, et maintenant comment mettre à jour la colonne (COL1) de TABLE_U? Comme pour le groupe_ 1 a ID_1, groupe_ 2 a ID_2 ..... (ID de TABLE_I)



2
votes

C'est quelque chose qui a fonctionné pour moi: xxx

mes tables de test: xxx

La valeur la plus élevée de la deuxième table a été attribuée à 28 fois, d'autres 27 fois. C'est parce que j'ai utilisé xxx

pour compter la colonne de jonction. Je ne sais pas si c'est important pour toi. :) La base de cette solution est mod () qui nous permet de faire cycle entre 1 et cnt (dans ce cas 4).

Vous pouvez le faire dans PLSQL comme vous l'avez montré, mais les solutions SQL sont généralement plus rapides et préférées lorsque cela est possible.


1 commentaires

Ponder - Je viens de tester votre code et sur mon site travaille, génial, merci de l'aide!



0
votes

J'ai trouvé une erreur et l'a fait avec mon code PL / SQL aussi:

...
x_mapUser Number := 0
...
OPEN cur;
 LOOP FETCH cur INTO l_rec;
  EXIT WHEN cur%notfound;
     UPDATE table_U SET USER_ID = V1(c_obj_id) WHERE CURRENT OF cur;

     IF x_mapUser > mapUser-1 AND c_obj_id < count_id Then
            x_mapUser := 0;
            c_obj_id := c_obj_id +1;
     End if;

 x_mapUser := x_mapUser +1;

 END LOOP;
CLOSE cur;


0 commentaires