Usuário com melhor resposta
Como criar sequencial de um agrupamento respeitando a ordem do indice?

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 4RESULTADO 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 4Eu consigo resolver com cursor, alguém conhece algum outro jeito?
Grato!
Respostas
-
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
- Marcado como Resposta Michael Nascimento domingo, 31 de dezembro de 2017 19:52
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
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 6 de janeiro de 2018 20:47
-
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 4Logo: 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 4Aguardando para ver se alguém conhece outro método que resolva isso. Valeu!
-
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
- Marcado como Resposta Michael Nascimento domingo, 31 de dezembro de 2017 19:52
-