J'ai le nombre d'identifiants: Je sais que j'ai totalement donc j'ai maintenant je veux total_user = 109 code> (nombre d'enregistrements). Donc, je veux le scinder au groupe égal: p>
4 groupe code>. Dans le
les trois premiers sera 27 code> et
Dernier doit être 28 code> utilisateurs. P>
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;
3 Réponses :
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;
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)
C'est quelque chose qui a fonctionné pour moi: mes tables de test: p> 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é p> pour compter la colonne de jonction. Je ne sais pas si c'est important pour toi. :) La base de cette solution est 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. P> P> mod () code> qui nous permet de faire cycle entre
1 code> et
cnt code> (dans ce cas 4). p>
Ponder - Je viens de tester votre code et sur mon site travaille, génial, merci de l'aide!
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;
Les échantillons de données et les résultats souhaités sont vraiment une grande aide.