none
randon em sql RRS feed

  • Pergunta

  • Gostaria de saber como eu faço para selecionar uma quantidade x de linhas de uma tabela e que essa seleçao seja aleatoria.

    somente o comando TOP nao é suficiente, pois nao é aleatorio...

    com o comando RAND eu nao consegui, pois ele gera somente um numero, e eu preciso que seja possivel selecionar a quantidade que eu determinar e que seja inteiramente aleatoria.
    quarta-feira, 28 de outubro de 2009 12:30

Respostas

  • Utiliza o Orber by com NewId(). Ele organiza os registros de forma aleatória. Então basta utilizar o top para definir a quantidade X de registros que você deseja. Exemplo:


    SELECT
    
     TOP
    
     10 * FROM
    
     <TABELA> ORDER
    
     BY
    
     NEWID
    
    ()

    Abs.
    Ivan Candido - http://ivandba.spaces.live.com
    mas, qual será a relaçao gerada no order by?

    ele vai ordenar segundo algum criterio contido na tabela (por exemplo alguns dos campos)?

    Por exemplo:
    eu trabalho com tabelas que normalmente estao ordenadas pelo cep do cadastro. eu preciso, por exemplo, selecionar aleatoriamente, de forma que nao aconteça de serem pegas muitas linhas seguidas, pois eu pretendo fazer um estudo de caso, e quanto mais aleatoria for a seleçao será a melhor opçao!!

    Se me for garantido que assim ele realmente organiza de forma aleatória os registros eu me contento...


    Desde ja muito grato.

    Leonardo Bandeira.


    A função NEWID() gera um novo GUID (Global Unique Identifier) a cada execução, ou seja, a mesmo que seja executado ao mesmo tempo em servidores diferentes, os valores não se repetem. No Order by, para cada registro será gerado um novo GUID e os registros serão ordenados de acordo com esses valores. A ordenação não irá se repetir, já que em cada execução os GUIDs gerados serão diferentes.

    Abs.


    Ivan Candido - http://ivandba.spaces.live.com
    quarta-feira, 28 de outubro de 2009 14:24

Todas as Respostas

  • Segue um exemplo:

    select

     

    top(cast((rand() * 100) as integer)) * from tabela


    Att. Leandro Hexsel Bugalho
    • Sugerido como Resposta Leandro Bugalho quarta-feira, 28 de outubro de 2009 13:00
    quarta-feira, 28 de outubro de 2009 13:00
  • Leonardo,

    Se entendi sua duvida o top variavel te ajuda (disponivel em sql 2005 ou superior)

    declare @top int
    set @top = 10
    
    select top (@top) * from table


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quarta-feira, 28 de outubro de 2009 13:10
  • Utiliza o Orber by com NewId(). Ele organiza os registros de forma aleatória. Então basta utilizar o top para definir a quantidade X de registros que você deseja. Exemplo:


    SELECT TOP 10 * FROM <TABELA> ORDER BY NEWID()

    Abs.
    Ivan Candido - http://ivandba.spaces.live.com
    quarta-feira, 28 de outubro de 2009 13:11
  • Utiliza o Orber by com NewId(). Ele organiza os registros de forma aleatória. Então basta utilizar o top para definir a quantidade X de registros que você deseja. Exemplo:


    SELECT
     TOP
     10 * FROM
     <TABELA> ORDER
     BY
     NEWID
    ()

    Abs.
    Ivan Candido - http://ivandba.spaces.live.com
    mas, qual será a relaçao gerada no order by?

    ele vai ordenar segundo algum criterio contido na tabela (por exemplo alguns dos campos)?

    Por exemplo:
    eu trabalho com tabelas que normalmente estao ordenadas pelo cep do cadastro. eu preciso, por exemplo, selecionar aleatoriamente, de forma que nao aconteça de serem pegas muitas linhas seguidas, pois eu pretendo fazer um estudo de caso, e quanto mais aleatoria for a seleçao será a melhor opçao!!

    Se me for garantido que assim ele realmente organiza de forma aleatória os registros eu me contento...


    Desde ja muito grato.

    Leonardo Bandeira.
    quarta-feira, 28 de outubro de 2009 13:56
  • Utiliza o Orber by com NewId(). Ele organiza os registros de forma aleatória. Então basta utilizar o top para definir a quantidade X de registros que você deseja. Exemplo:


    SELECT
    
     TOP
    
     10 * FROM
    
     <TABELA> ORDER
    
     BY
    
     NEWID
    
    ()

    Abs.
    Ivan Candido - http://ivandba.spaces.live.com
    mas, qual será a relaçao gerada no order by?

    ele vai ordenar segundo algum criterio contido na tabela (por exemplo alguns dos campos)?

    Por exemplo:
    eu trabalho com tabelas que normalmente estao ordenadas pelo cep do cadastro. eu preciso, por exemplo, selecionar aleatoriamente, de forma que nao aconteça de serem pegas muitas linhas seguidas, pois eu pretendo fazer um estudo de caso, e quanto mais aleatoria for a seleçao será a melhor opçao!!

    Se me for garantido que assim ele realmente organiza de forma aleatória os registros eu me contento...


    Desde ja muito grato.

    Leonardo Bandeira.


    A função NEWID() gera um novo GUID (Global Unique Identifier) a cada execução, ou seja, a mesmo que seja executado ao mesmo tempo em servidores diferentes, os valores não se repetem. No Order by, para cada registro será gerado um novo GUID e os registros serão ordenados de acordo com esses valores. A ordenação não irá se repetir, já que em cada execução os GUIDs gerados serão diferentes.

    Abs.


    Ivan Candido - http://ivandba.spaces.live.com
    quarta-feira, 28 de outubro de 2009 14:24
  • Ivan,

    Eu já utilizei muito a função NewID(), mas a algum tempo eu já realizei alguns testes com a função RAND().
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 28 de outubro de 2009 18:47