- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por JamirJr.
-
AutorPosts
-
20 de maio de 2008 às 10:40 pm #81844rabbitvixParticipante
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;
20 de maio de 2008 às 11:13 pm #81845JamirJrParticipantedá uma olhada aqui:
https://www.profissionaloracle.com.br/mo … highlight=21 de maio de 2008 às 12:20 am #81846rabbitvixParticipanteValeu 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_DepartamentoUm abraço e mais uma vez, valeu!
21 de maio de 2008 às 4:42 pm #81847Anônimoveja 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 58 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.
26 de maio de 2008 às 6:55 pm #81869JamirJrParticipanteó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!) -
AutorPosts
- Você deve fazer login para responder a este tópico.