preciso fazer uma select que pegue numeros aleatorios do campo cod_pessoa do banco firebird

14/09/2020

4

preciso fazer uma select que pegue numeros aleatorios do campo cod_pessoa do banco firebird
Responder

Posts

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:
SELECT COUNT(COD_PESSOA) NTOTAL FROM TABELA
ntotalregistros receberá o retorno da instrução acima.

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:
SELECT COUNT(COD_PESSOA) NTOTAL FROM TABELA
ntotalregistros receberá o retorno da instrução acima.

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar