preciso fazer uma select que pegue numeros aleatorios do campo cod_pessoa do banco firebird
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
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
Clique aqui para fazer login e interagir na Comunidade :)