문제

Oracle 쿼리의 여러 그룹에 대해 어떻게 N 결과를 얻을 수 있습니까?

예를 들어, 다음 표는 다음과 같습니다.

|--------+------------+------------|
| emp_id | name       | occupation |
|--------+------------+------------|
|      1 | John Smith | Accountant |
|      2 | Jane Doe   | Engineer   |
|      3 | Jack Black | Funnyman   |
|--------+------------+------------|

더 많은 직업이있는 더 많은 행이 있습니다. 각 직업에서 직원 3 명 (말하면)을 받고 싶습니다.

하위 쿼리를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

이것은 원하는 것을 생성하며 상단 N 또는 Rank ()와 같은 공급 업체 별 SQL 기능을 사용하지 않습니다.

SELECT MAX(e.name) AS name, MAX(e.occupation) AS occupation 
FROM emp e 
  LEFT OUTER JOIN emp e2 
    ON (e.occupation = e2.occupation AND e.emp_id <= e2.emp_id) 
GROUP BY e.emp_id 
HAVING COUNT(*) <= 3 
ORDER BY occupation;

이 예에서는 3 명의 직원에게 직업 당 EMP_ID 값이 가장 낮습니다. 불평등 비교에 사용 된 속성을 변경하여 최고 직원에게 이름 또는 무엇이든 줄 수 있습니다.

다른 팁

지금은 오라클 인스턴스가 없으므로 테스트하지 않았습니다.

select *
from (select emp_id, name, occupation,
      rank() over ( partition by occupation order by emp_id) rank
      from employee)
where rank <= 3

다음은 RANK의 작동 방식에 대한 링크입니다. http://www.psoug.org/reference/rank.html

Rownum을 추가하여 순위를 매 깁니다.

select * from 
         (select emp_id, name, occupation,rank() over ( partition by occupation order by emp_id,RowNum) rank   
                      from employee) 
         where rank <= 3 

SQL Server에서 이것을 테스트했습니다 (하위 쿼리를 사용)

select emp_id, name, occupation
from employees t1
where emp_id IN (select top 3 emp_id from employees t2 where t2.occupation = t1.occupation)

귀하의 요구에 맞게 하위 쿼리에서 주문을하십시오.

이것이 매우 효율적이지는 확실하지 않지만 아마도 출발점일까요?

select *
from people p1
    join people p2
        on p1.occupation = p2.occupation
    join people p3
        on p1.occupation = p3.occupation
        and p2.occupation = p3.occupation
where p1.emp_id != p2.emp_id
    and p1.emp_id != p3.emp_id

이것은 같은 직업에 3 명의 별개의 직원을 포함하는 행을 제공해야합니다. 불행히도, 그것은 당신에게 그것들의 모든 조합을 줄 것입니다.

누구든지 이것을 제발 제발 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top