none
Como criar sequencial de um agrupamento respeitando a ordem do indice? RRS feed

  • Pergunta

  • Olá pessoal,

    Alguém poderia me ajudar com um problema?

    Eu preciso criar uma sequência de um agrupamento respeitando a ordem da chave primária.

    Segue exemplo:

    TABELA

    IDX  VAL  
    1    11
    2    11
    3    3
    4    3
    5    2
    6    2
    7    4
    8    4

    RESULTADO DESEJADO

    IDX  VAL   SEQ
    1    11    1
    2    11    1
    3    3      2
    4    3      2
    5    2      3
    6    2      3
    7    4      4
    8    4      4

    Eu consigo resolver com cursor, alguém conhece algum outro jeito?

    Grato!

    sábado, 30 de dezembro de 2017 13:28

Respostas

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    with CTE_Rank as
    (
        select 
            IDX,
            VAL,
            DENSE_RANK() OVER(ORDER BY VAL DESC) AS SEQ
        from Tabela
    )
    
    select
        *
    from CTE_Rank
    order by
        SEQ,
        IDX

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sábado, 30 de dezembro de 2017 15:50
  • Muito obrigado amigo pela ajuda, porém ainda não é o que eu preciso.

    O seu exemplo trouxe o resultado:

    ID VAL SEQ
    7    4     1
    8    4     1
    3    3     2
    4    3     2
    5    2     3
    6    2     3
    1   11    4
    2   11    4

    Logo: A coluna Seq não está seguindo a ordem da coluna IDX.

    Já havia tentado com as funções dense_rank, rank, etc.

    O que eu preciso é agrupar os valores iguais da coluna VAL (independente qual seja o valor) e criar uma sequência na ordem (crescente ou decrescente) mas precisa respeitar a ordem da chave primária (idx). Parece relativamente simples porém, ainda não consegui uma solução sem usar um loop.

    Resultado desejado:

    IDX  VAL   SEQ
    1    11    1
    2    11    1
    3    3      2
    4    3      2
    5    2      3
    6    2      3
    7    4      4
    8    4      4

    Aguardando para ver se alguém conhece outro método que resolva isso. Valeu!

    sábado, 30 de dezembro de 2017 16:31
  • Experimente dessa forma:

    with CTE_RN as
    (
        select 
            IDX,
            VAL,
            ROW_NUMBER() OVER(ORDER BY IDX) AS RN,
            ROW_NUMBER() OVER(PARTITION BY VAL ORDER BY IDX) AS RNP
        from Tabela
    )
    
    select
        IDX,
        VAL,
        DENSE_RANK() OVER(ORDER BY RN - RNP) AS SEQ
    from CTE_RN

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    domingo, 31 de dezembro de 2017 17:14
  • Nice!

    É isso mesmo.

    Muito obrigado e um feliz ano novo.

    Boas festas, abraço!

    domingo, 31 de dezembro de 2017 19:52