none
Top com distinct RRS feed

  • Pergunta

  • Galera preciso fazer uma query que faça um select distinct nome . mas que traga os outros dados..

    vamos la..

    tenho minha tabela empresa

    nome | endereco
    jao     | rua 1
    maria | rua 3
    jao     | rua 2

     

    preciso fazer um distinct no nome sómente ...  a condicao dele vai ser 

    selecionar distinct nome .

    resultado:

    nome | endereco
    jao     | rua 1
    maria | rua 3

    ele precisa fazer distinct no nome mas tambem trazer os outros campos...  no meu caso eu tbm uso um Top (20) que faz Newid() no order by .

    locura que deu errado Select distinct (nome) top 20 ....

     

    desde ja agradecido qualquer coisa entro  com mais detalhes ;d

    segunda-feira, 31 de janeiro de 2011 15:47

Respostas

  • segue um exemplo usando row_number com cte

    declare @table table(nome varchar(15), endereco varchar(15))
    insert into @table values('jao','Rua1')
    insert into @table values('maria','Rua3')
    insert into @table values('jao','Rua2')
    
    ;with cte_Dados
    as
    (
    select nome, endereco, row_number() over (PARTITIOn by nome order by nome,endereco) as 'contador' from @table 
    )
    select nome, endereco from cte_Dados where contador=1
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Raul Santos Neto segunda-feira, 31 de janeiro de 2011 16:11
    • Marcado como Resposta Jeferson Medeiros segunda-feira, 31 de janeiro de 2011 20:14
    segunda-feira, 31 de janeiro de 2011 15:58
  • teste assim

    ;with cte_dados
    as
    (
    SELECT   id, NomeF, pchave, tipo_endereco, Endereco, Numero, Bairro, Cidade, seguimento, segmento1, segmento2, telefone1, telefone2, Associado, 
          logo1, logo2, logo3, logo4, obs, mapa, Cep, Email, site, logo, Video, Datadecadastro, RazaoSocial, Complemento, Responsavel, datadenascimentoR,
          CnpjCpf, RG, datatermino, valorcontrato, Observacao
          , row_number() over (PARTITIOn by NomeF order by NomeF,NEWID()) as 'contador'
    FROM     Empresa
    WHERE   (Associado = @Ouro) OR
         (Associado = @Prata) OR
         (Associado = @Bronze)
    )
    
    select top 20 * from cte_dados where contador=1

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 31 de janeiro de 2011 17:10

Todas as Respostas

  • Jefferson

    no seu exemplo jao rua1 é diferente de jao rua2, por isto o camando traz os 2... vc escolhei i jao rua1, existe algum critério para ser o rua1? e qual a versão de seu sql? se for 2005 ou 2008 vc pode usar o row_count

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 31 de janeiro de 2011 15:54
  • segue um exemplo usando row_number com cte

    declare @table table(nome varchar(15), endereco varchar(15))
    insert into @table values('jao','Rua1')
    insert into @table values('maria','Rua3')
    insert into @table values('jao','Rua2')
    
    ;with cte_Dados
    as
    (
    select nome, endereco, row_number() over (PARTITIOn by nome order by nome,endereco) as 'contador' from @table 
    )
    select nome, endereco from cte_Dados where contador=1
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Raul Santos Neto segunda-feira, 31 de janeiro de 2011 16:11
    • Marcado como Resposta Jeferson Medeiros segunda-feira, 31 de janeiro de 2011 20:14
    segunda-feira, 31 de janeiro de 2011 15:58
  • extamente o joao rua 1 é diferente do joao rua 2 porem é a mesma empresa em enderecos diferentes..

    preciso que ele verifique o nome e se for igual ele escolhe um com o newid()

    talvez o row_number funcione mas não tenho muita pratica com ele se puder comentar as linhas eu agradeço.

    segunda-feira, 31 de janeiro de 2011 16:18
  • da uma olhada no exemplo que postei...

    tente converter apra seu código caso não consiga poste o seu script para que possamos avaliar

    OBS. só funciona em SQL Server 2005 e 2008!

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 31 de janeiro de 2011 16:24
  • cara tente mas não sei nem onde infia o row_number ;/

    SELECT     TOP (20) id, NomeF, pchave, tipo_endereco, Endereco, Numero, Bairro, Cidade, seguimento, segmento1, segmento2, telefone1, telefone2, Associado,
                          logo1, logo2, logo3, logo4, obs, mapa, Cep, Email, site, logo, Video, Datadecadastro, RazaoSocial, Complemento, Responsavel, datadenascimentoR,
                          CnpjCpf, RG, datatermino, valorcontrato, Observacao
    FROM         Empresa
    WHERE     (Associado = @Ouro) OR
                          (Associado = @Prata) OR
                          (Associado = @Bronze)
    ORDER BY NEWID()

     

    essa é minha query . o campo que deve fazer o tal distinct é o NomeF sómente.

    segunda-feira, 31 de janeiro de 2011 16:54
  • teste assim

    ;with cte_dados
    as
    (
    SELECT   id, NomeF, pchave, tipo_endereco, Endereco, Numero, Bairro, Cidade, seguimento, segmento1, segmento2, telefone1, telefone2, Associado, 
          logo1, logo2, logo3, logo4, obs, mapa, Cep, Email, site, logo, Video, Datadecadastro, RazaoSocial, Complemento, Responsavel, datadenascimentoR,
          CnpjCpf, RG, datatermino, valorcontrato, Observacao
          , row_number() over (PARTITIOn by NomeF order by NomeF,NEWID()) as 'contador'
    FROM     Empresa
    WHERE   (Associado = @Ouro) OR
         (Associado = @Prata) OR
         (Associado = @Bronze)
    )
    
    select top 20 * from cte_dados where contador=1

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 31 de janeiro de 2011 17:10
  • funcionou perfeitamente.. mas uma vez obrigado!
    segunda-feira, 31 de janeiro de 2011 20:14