none
Distinct com order by newid é possivel? RRS feed

  • Pergunta

  • Boa Tarde, estou com uma dificuldade se puderem me ajudar ficarei muito grato!

    Estou fazendo a seguinte consulta em minha tabela:

    select

    id_cliente, max(titulo) as titulo

    from

    painel_home

    group

    by id_cliente

    Só que este select retorna sempre os mesmos valores.

    Deixe-me explicar melhor, minha tabela tem os seguintes valores:

    ID | ID_CLIENTE | TITULO

    1         2              Nome 1

    2         2              Nome 2

    3         1              Nome 3

    4         3              Nome 4

     

    Gostaria de dar um distinct no campo ID_Cliente. Isso me mostraria 3 resultados. No entanto, sempre mostra o mesmo resultado para o cliente código 2. Gostaria que me retornasse hora "Nome 1" e hora "Nome 2" aleatoriamente...

    Se eu utilizar Select * from painel_home order by NEWID() ele mostrará 2 resultados do mesmo cliente.

    Deu pra pegar a idéia? Não sei se fui claro ou confuso...

    sexta-feira, 1 de abril de 2011 15:10

Respostas

  • Segue um exemplo com os demais campos:

    SELECT ID_CLIENTE,
      TITULO,
      TEXTO
    FROM (  
       SELECT ID_CLIENTE,
         TITULO,
         TEXTO,
         ROW_NUMBER () OVER (PARTITION BY ID_CLIENTE ORDER BY NEWID()) AS LINHA
       FROM painel_home A 
      ) CONSULTA
    WHERE LINHA = 1


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Marcado como Resposta Eder Costa quinta-feira, 7 de abril de 2011 17:21
    sexta-feira, 1 de abril de 2011 21:45

Todas as Respostas

  • Veja se era isso:

    CREATE TABLE painel_home
    (
     ID INT,
     ID_CLIENTE INT,
     TITULO VARCHAR(10)
    )

    INSERT INTO painel_home
    VALUES (1,2,'NOME 1'), (2,2,'NOME 2'),(3,1,'NOME 3'),(4,3,'NOME 4')

    SELECT ID_CLIENTE,
      (SELECT TOP 1 TITULO FROM painel_home B WHERE A.ID_CLIENTE = B.ID_CLIENTE ORDER BY NEWID()) AS TITULO
    FROM painel_home A 
    GROUP BY
      ID_CLIENTE


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Sugerido como Resposta Eder Costa quinta-feira, 7 de abril de 2011 17:20
    sexta-feira, 1 de abril de 2011 15:48
  • Deu certo sim!!!!

    Restou uma última dúvida.

    Se eu quiser mostrar outros campos da tabela e não só o título, aonde devo acrescentar? Gostaria de mostrar nos resultados tb as colunas Texto e URL. Tentei isso mas nao consegui:

    SELECT ID_CLIENTE,
      (SELECT TOP 1 TITULO, TEXTO, URL FROM painel_home B WHERE A.ID_CLIENTE = B.ID_CLIENTE ORDER BY NEWID()) AS TITULO, TEXTO, URL
    FROM painel_home A 
    GROUP BY
      ID_CLIENTE

    Alguma última luz? Muitíssimo Obrigado

    sexta-feira, 1 de abril de 2011 17:58
  • Gustavo,

    Qual foi o erro retornado pelo SQL Server?

    Declare somente estes campos fora do Select denominado de Titulo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    sexta-feira, 1 de abril de 2011 19:27
  • Mostra a seguinte mensagem:

    Msg 116, Level 16, State 1, Line 1

    Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

    sexta-feira, 1 de abril de 2011 19:35
  • Segue um exemplo com os demais campos:

    SELECT ID_CLIENTE,
      TITULO,
      TEXTO
    FROM (  
       SELECT ID_CLIENTE,
         TITULO,
         TEXTO,
         ROW_NUMBER () OVER (PARTITION BY ID_CLIENTE ORDER BY NEWID()) AS LINHA
       FROM painel_home A 
      ) CONSULTA
    WHERE LINHA = 1


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Marcado como Resposta Eder Costa quinta-feira, 7 de abril de 2011 17:21
    sexta-feira, 1 de abril de 2011 21:45
  • Muito Obrigado! Deu certo, era exatamente isso que eu queria!

    Mas isso ainda ta muito avançado pra mim!

     

    Obrigado

    segunda-feira, 4 de abril de 2011 15:00