Pular para o conteúdo
  • Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 9 anos, 1 mês atrás por Avatar de antognolliantognolli.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #107304
    Avatar de antognolliantognolli
    Participante

      Senhores, boa tarde.

      Estou com dúvidas em como implementar um algoritmo da melhor forma (buscando rendimento e otimização de código).

      Cenário
      Tenho vários valores inteiros numa tabela e gostaria de saber qual dos valores somados resultam em determinado número.

      Ex:
      Supondo que eu tenha os seguintes valores na tabela:
      1,2,3,4,5,6,7,8

      Gostaria de saber qual desses valores somados resulta no número 12.
      A resposta seria algo como:

      1+2+3+6 = 12
      1+3+8 = 12
      1+4+7 = 12
      1+5+6 = 12
      2+3+7 = 12
      2+4+6 = 12
      8+4 = 12
      6+5+1 = 12
      6+4+2 = 12
      6+5+1 = 12
      7+5 = 12
      7+4+1 = 12
      7+3+2 = 12
      (…)

      Imaginei trabalhando com cursores… Mas como no ambiente real eu vou ter muito mais informações tenho receio de onerar mto minha rotina. Enfim, alguém pode dar alguma ideia?

      *Essa rotina tbm vai ser escrita em SQL SERVER num segundo momento, então quanto menos PL/SQL for utilizado melhor! 🙂

      Obrigado…

      #107307
      Avatar de rmanrman
      Participante

        @antognolli

        Só por curiosidade, onde será aplicado isso?

        Montei o cenário desta forma:


        CREATE TABLE NUMEROS(
        ID NUMBER
        ,NUMERO NUMBER
        );

        ALTER TABLE NUMEROS ADD CONSTRAINT PK_NUMEROS PRIMARY KEY(ID);

        ALTER TABLE NUMEROS MODIFY NUMERO CONSTRAINT NN_NUMEROS_NUMERO NOT NULL;


        INSERT INTO NUMEROS(ID,NUMERO) VALUES(1,1);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(2,2);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(3,3);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(4,4);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(5,5);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(6,6);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(7,7);
        INSERT INTO NUMEROS(ID,NUMERO) VALUES(8,8);

        COMMIT;


        SELECT N1.NUMERO X1,N2.NUMERO X2,N3.NUMERO X3,N4.NUMERO X4,N5.NUMERO X5,N6.NUMERO X6,N7.NUMERO X7,N8.NUMERO X8
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
        LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
        LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
        LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
        LEFT JOIN NUMEROS N8 ON N8.NUMERO > N7.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO+N7.NUMERO+N8.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,N6.NUMERO,N7.NUMERO,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
        LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
        LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
        LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO+N7.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,N6.NUMERO,NULL,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
        LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
        LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
        LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,NULL,NULL,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
        LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,NULL,NULL,NULL,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,NULL,NULL,NULL,NULL,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
        WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO = 12

        UNION

        SELECT N1.NUMERO,N2.NUMERO,NULL,NULL,NULL,NULL,NULL,NULL
        FROM NUMEROS N1
        LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
        WHERE N1.NUMERO+N2.NUMERO = 12

        ORDER BY 1,2,3,4,5,6,7,8

        A combinação de numeros de 1 a 8 que somados resultam em 12 são 10 :woohoo:

        Essa é a ideia. Para tornar isso dinamico, utilize monte o SELECT dinamicamente e execute com EXECUTE IMMEDIATE do PL/SQL

        #107308
        Avatar de antognolliantognolli
        Participante

          RMan, boa tarde.

          Seu cenário ficou melhor que o meu e diga-se de passagem, mais simples. Parabéns! 😉

          Isso vai ser aplicado numa rotina de PCP onde eu tenho uma máquina com determinada capacidade e vários produtos a produzir.

          Vou encaixar todas as possibilidades de produção dentro da capacidade de máq.

          Ex: Capacidade da maq: 200 metros.
          Produto1 = 20 metros
          Produto2 = 30 metros
          (…)

          Vou apresentar uma lista com todas as possibilidades de produtos para a capacidade informada.

          Eu estava trabalhando com cursores aninhados.

          Obrigado pela ajuda! 🙂

          #107309
          Avatar de rmanrman
          Participante

            @antognolli

            Agora que você disse que é uma rotina PCP faz sentido.

            Fiquei pensando se com cursores aninhados teria um desempenho melhor. Creio que não. Se você implementou compare e poste o resultado.

            #107310
            Avatar de antognolliantognolli
            Participante

              Rman,

              Não terminei de implantar com cursores, pq a manutenção ia ficar muito mais trabalhosa.

              Fora que a sua é praticamente uma solução “ANSI”. Implementando com cursores eu teria as particularidades do SQL SERVER e do ORACLE para lidar no futuro.

              =)

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.
            plugins premium WordPress