Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #81844
    rabbitvix
    Participante

      Prezados Colegas,

      Estou migrando minhas bases Access/SQL Server para Oracle, e porquanto disto estou às voltas com o seguinte problema:

      Neste exemplo que segue, preciso retornar o primeiro salário encontrado para cada departamento, independente se é o maior ou menor, portanto:

      No SQL Server:
      SELECT department_id,
      FIRST(salary) AS Primeiro_Salário_Encontrado
      FROM employees
      GROUP BY department_id;

      No Ora:
      ?????
      A função FIRST não é utilizada diretamente no SQL do Oracle.

      Procurando na base de documentação da própria Oracle, temos o seguinte exemplo usando um “metodo” FIRST numa função agregada, porém não é o que preciso.

      SELECT department_id,
      MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) “Worst”,
      MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) “Best”
      FROM employees
      GROUP BY department_id;

      Depois estudei a função FIRST_VALUE usando o exemplo proposto, também não funcionou.

      Alguém tem uma idéia de como posso recupar tal informação?

      Um abraço;

      #81845
      JamirJr
      Participante

        dá uma olhada aqui:
        https://www.profissionaloracle.com.br/mo … highlight=

        #81846
        rabbitvix
        Participante

          Valeu pela dica Jamir, mas em meu caso o que quero retornar não é a primeira linha de uma consulta, quero retornar a primeira linha referente a cada departamento. Sacou?

          Dá até pra resolver “em parte” utilizando a funcão MIN() como no exemplo abaixo, porém não concordo com este método. Fazer o que não é mesmo? Aguardar a ajuda dos Colegas!

          SELECT
          Dep.Num_Departamento_Dep AS DEPARTAMENTO,
          MIN(Func.Salario_Func) AS SALÁRIO
          FROM
          Departamentos Dep,
          Funcionarios Func
          WHERE
          Dep.Registro_Dep = Func.Registro_Dep_Func
          GROUP BY
          Dep.Num_Departamento
          ORDER BY
          Dep.Num_Departamento

          Um abraço e mais uma vez, valeu!

          #81847
          Anônimo

            veja esse exemplo, talvez ajude…

            SELECT empno, deptno, hiredate,
            ROW_NUMBER( ) OVER (PARTITION BY
            deptno ORDER BY hiredate
            NULLS LAST) SRLNO
            FROM emp
            WHERE deptno IN (10, 20)
            ORDER BY deptno, SRLNO;

            EMPNO DEPTNO HIREDATE SRLNO


            7782 10 09-JUN-81 1
            7839 10 17-NOV-81 2
            7934 10 23-JAN-82 3
            7369 20 17-DEC-80 1
            7566 20 02-APR-81 2
            7902 20 03-DEC-81 3
            7788 20 09-DEC-82 4
            7876 20 12-JAN-83 5

            8 rows selected.

            o 1o. resitro de cada depto tem o nro 1 no campo SRLNO.
            agora se vc adaptar para :

            select * from
            (SELECT empno, deptno, hiredate,
            ROW_NUMBER( ) OVER (PARTITION BY
            deptno ORDER BY hiredate
            NULLS LAST) SRLNO
            FROM emp
            WHERE deptno IN (10, 20)
            ORDER BY deptno, SRLNO)
            where srlno= 1;

            deve funcionar.

            #81869
            JamirJr
            Participante

              ótimo exemplo do colega!

              como poderiamos nomeá-lo?

              FIRST BY GROUP
              GROUP BY FIRST
              primeiro por grupo (mais fácil de achar na pesquisa, hehehe!)

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