Fórum preciso fazer uma select que pegue numeros aleatorios do campo cod_pessoa do banco firebird #612833
14/09/2020
0
preciso fazer uma select que pegue numeros aleatorios do campo cod_pessoa do banco firebird
Lucas
Curtir tópico
+ 0
Responder
Posts
14/09/2020
Emerson Nascimento
tem uma quantidade definida de números ?
será pelo FB (qual versão?) ou pelo Delphi ?
acredito que cod_pessoa tenha conteúdo único na tabela. se for isso, você pode tentar algo assim:
primeiro é necessário saber quantos registros serão tratados:
ntotalregistros receberá o retorno da instrução acima.
com o número de registros em mãos, faz o sorteio:
faça as adaptações necessárias
será pelo FB (qual versão?) ou pelo Delphi ?
acredito que cod_pessoa tenha conteúdo único na tabela. se for isso, você pode tentar algo assim:
primeiro é necessário saber quantos registros serão tratados:
SELECT COUNT(COD_PESSOA) NTOTAL FROM TABELA
com o número de registros em mãos, faz o sorteio:
var
sorteados: array of integer; // guarda quais registros foram sorteados
ntotsorteio, nsorteio: integer; // qtd de registros que serão sorteados, numero sorteado
strlistain: string; // lista utilizada na cláusula IN da instrução SQL
function naoexiste(numero: integer): boolean; // função que verifica se o um número já foi sorteado
var i: integer
begin
result := true;
for i := low(sorteados) to high(sorteados) do
if sorteados[i] = numero then
begin
result := false;
exit;
end;
end;
begin
ntotsorteio := 5; // numero de registros que serão sorteados
strlistain := ''; // lista utilizada na cláusula IN da instrução SQL
// corrige o total de números a serem sorteados,
// se for um número maior que o total de registros da tabela
if ntotsorteio > ntotalregistros then
ntotsorteio := ntotalregistros;
randomize; // inicializa o randomizador
// sorteia os registros que serão utilizados (5 registros)
while length(sorteados) < ntotsorteio do
begin
nsorteio := random(ntotalregistros)+1;
if naoexiste(nsorteio) then
begin
setlenght(sorteados, lenght(sorteados)+1);
sorteados[high(sorteados)] := nsorteio;
// monta a lista de itens para ser usada na cláusula IN da instrução SQL
if strlistain <> emptystr then strlistain := strlistain + ',';
strlistain := strlistain + inttostr(sorteados[nsorteio]);
end;
end;
// agora, com todos os números sorteados, pego os registros da tabela
query.sql.text :=
'SELECT COD_PESSOA '+
'FROM ('+
'SELECT '+
' COUNT(T2.COD_PESSOA)+1 REGISTRO, '+
' T1.COD_PESSOA '+
'FROM '+
' TABELA T1 '+
'LEFT JOIN '+
' TABELA T2 ON T2.COD_PESSOA < T1.COD_PESSOA '+
') TAB '+
'WHERE REGISTRO IN (' + strlistain + ') ';
query.Open;
end;faça as adaptações necessárias
Responder
Gostei + 0
14/09/2020
Lucas
tem uma quantidade definida de números ?
será pelo FB (qual versão?) ou pelo Delphi ?
acredito que cod_pessoa tenha conteúdo único na tabela. se for isso, você pode tentar algo assim:
primeiro é necessário saber quantos registros serão tratados:
ntotalregistros receberá o retorno da instrução acima.
com o número de registros em mãos, faz o sorteio:
faça as adaptações necessárias
será pelo FB (qual versão?) ou pelo Delphi ?
acredito que cod_pessoa tenha conteúdo único na tabela. se for isso, você pode tentar algo assim:
primeiro é necessário saber quantos registros serão tratados:
SELECT COUNT(COD_PESSOA) NTOTAL FROM TABELA
com o número de registros em mãos, faz o sorteio:
var
sorteados: array of integer; // guarda quais registros foram sorteados
ntotsorteio, nsorteio: integer; // qtd de registros que serão sorteados, numero sorteado
strlistain: string; // lista utilizada na cláusula IN da instrução SQL
function naoexiste(numero: integer): boolean; // função que verifica se o um número já foi sorteado
var i: integer
begin
result := true;
for i := low(sorteados) to high(sorteados) do
if sorteados[i] = numero then
begin
result := false;
exit;
end;
end;
begin
ntotsorteio := 5; // numero de registros que serão sorteados
strlistain := ''; // lista utilizada na cláusula IN da instrução SQL
// corrige o total de números a serem sorteados,
// se for um número maior que o total de registros da tabela
if ntotsorteio > ntotalregistros then
ntotsorteio := ntotalregistros;
randomize; // inicializa o randomizador
// sorteia os registros que serão utilizados (5 registros)
while length(sorteados) < ntotsorteio do
begin
nsorteio := random(ntotalregistros)+1;
if naoexiste(nsorteio) then
begin
setlenght(sorteados, lenght(sorteados)+1);
sorteados[high(sorteados)] := nsorteio;
// monta a lista de itens para ser usada na cláusula IN da instrução SQL
if strlistain <> emptystr then strlistain := strlistain + ',';
strlistain := strlistain + inttostr(sorteados[nsorteio]);
end;
end;
// agora, com todos os números sorteados, pego os registros da tabela
query.sql.text :=
'SELECT COD_PESSOA '+
'FROM ('+
'SELECT '+
' COUNT(T2.COD_PESSOA)+1 REGISTRO, '+
' T1.COD_PESSOA '+
'FROM '+
' TABELA T1 '+
'LEFT JOIN '+
' TABELA T2 ON T2.COD_PESSOA < T1.COD_PESSOA '+
') TAB '+
'WHERE REGISTRO IN (' + strlistain + ') ';
query.Open;
end;faça as adaptações necessárias
no caso a quantidade sera passada por paramentros
banco firebrid 2.5
preciso pegar a quantidade definida pelo usuario no delphi
por exemplo a pessoa que está usando o programa seleciona que quer ''70%'' do banco de dados sejá pego aleatoriamente o banco tem uma quantidade de 1607 cod_pessoa ou seja ´preciso que desses 1607 sejem pegos 1.124 cod_pessoas aleatoriamente
ai n sei se é necessário fazer uma select ou o proprio delphi consegue fazer isso
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)