Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problemas com ROW_NUMBER


Xistyle

Pergunta

E ai pessoal?

Tudo bem?

Gostaria de saber se alguém pode me ajudar com o código abaixo. Vou explicar: eu preciso listar, na mesma linha de registros, várias informações que normalmente sairiam como linhas, em colunas.

Por exemplo:

ID NOME

15 LEONARDO

1659 RAFAEL

15984 DONATELLO

54216 MICHELANGELO

Tenho um select beeeem grande que precisaria retornar, na linha, essas colunas (apenas o nome), como o exemplo abaixo:

IDSERVICO NOME1 NOME2 NOME3 NOME4

45 LEONARDO RAFAEL DONATELLO MICHELANGELO

Se fosse no PostgreSQL, eu faria subqueries usando LIMIT (TOP) e OFFSET e encaixaria como uma luva. Mas o SQL Server não tem esse recurso, então tive que apelar para um workaround :x

Estou realizando a seguinte subquery, 6 vezes:

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 1)

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 2)

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 3)

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 4)

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 5)

(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 6)

Sendo que PRC.ID é uma tabela que está fora das subqueries, realizando o vínculo entre os registros.

Essa view tem o seguinte código:

SELECT ROWNR, RAZAOSOCIAL, ID FROM
        (
            SELECT    ROW_NUMBER() OVER(PARTITION BY PRC.ID ORDER BY PAR.ID_PARTE ASC) AS ROWNR, 
                    TER.NOME,
                    PAR.ID 
            FROM        PARTES                PAR WITH (NOLOCK) 
            INNER JOIN    TERCEIROSX        TER WITH (NOLOCK) ON TER.NTERC = PAR.NTERC 
            INNER JOIN    PRINCIPAL             PRC WITH (NOLOCK) ON PAR.ID = PRC.ID
            WHERE 
                PAR.IDADV_PARTETIPO = 1
        ) RESULT

Agora usando o OVER(PARTITION ...) está funcionando, mas está usando muitos recursos do servidor. O problema é que o PARTITION cria uma numeração de linha para cada processo, ou seja:

ROWNR ID NOME

1 45 XXX

2 45 YYY

3 45 ZZZ

1 485 KKKKKKK

2 485 RSRSRSRS

1 644 MIMIMIMI

e por ai vai.

Sem o PARTITION ficaria assim:

ROWNR ID NOME

1 45 XXX

2 45 YYY

3 45 ZZZ

4 485 KKKKKKK

5 485 RSRSRSRS

6 644 MIMIMIMI

Ele segue a contagem normal. O problema é que, com a subquery que passei acima, não a ROWNR 2 para o ID 485, e sim a ROWNR 5.

Já consegui fazer isso anteriormente, a mais de um mês, mas não lembro como fiz :o

Alguma sugestão?

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

fulvio, obrigado pela resposta. Consegui achar a solução que havia usado, a um mês atrás:

(SELECT RAZAOSOCIAL FROM (SELECT ROW_NUMBER() OVER(ORDER BY PAR.IDADV_PARTE ASC) AS ROWNR, TER.RAZAOSOCIAL AS RAZAOSOCIAL FROM PARTE PAR WITH (NOLOCK) INNER JOIN TERCEIROSX TER WITH (NOLOCK) ON TER.NTERC = PAR.NTERC WHERE PAR.ID = PRC.ID AND PAR.IDADV_PARTETIPO = 1) VW WHERE ROWNR = 1) AS PARTE_INT1

O desempenho foi muito bom, visto que criei uma function pra retornar esses dados (8260 registros) e levou cerca de 1h 30. Com essa subquery acima, levou IMENSOS 59 segundos.

Obrigado de qualquer forma e creio que seja interessante esse recurso para outros usuários.

EDIT: apenas complementando: acredito que deu certo desta forma, porque a forma de retorno da VIEW é diferente. A view retorna a massa de dados, não sendo possível filtrar pela linha corretamente. Transformando esse subquery, acredito que o SQL consiga trabalhar com o retorno da forma que eu precisava.

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...