복붙노트

[SQL] (오라클) 각 그룹에 대해 최고 결과를 얻을 수 있습니다

SQL

(오라클) 각 그룹에 대해 최고 결과를 얻을 수 있습니다

나는 여러 그룹에 대한 N 결과를 얻을 수있을 것입니다 방법 오라클 쿼리.

예를 들어, 주어진 다음의 표 :

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

더 직업에 더 많은 행이 있습니다. 나는 좀하고 싶습니다 3 명의 직원은 각 직업에서 (말할 수).

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

해결법

  1. ==============================

    1.이것은 당신이 원하는 것을 만들어 내고 TOP N 또는 RANK와 같은 더 공급 업체 특정 SQL 기능 ()를 사용하지 않습니다.

    이것은 당신이 원하는 것을 만들어 내고 TOP 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;
    

    이 예는 점령 당 가장 낮은 EMP_ID 값으로 3 명의 직원을 제공합니다. 당신은 이름, 또는 무엇이든에 의해 상부 직원을 제공하기 위해, 불평등 비교에 사용되는 속성을 변경할 수 있습니다.

  2. ==============================

    2.나는이 테스트를하지 않은, 그래서 지금은 오라클 인스턴스 편리 권한이 없습니다 :

    나는이 테스트를하지 않은, 그래서 지금은 오라클 인스턴스 편리 권한이 없습니다 :

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

    방법은 다음 순위의 작품에 대한 링크는 다음과 같습니다 http://www.psoug.org/reference/rank.html

  3. ==============================

    3.순위에 ROWNUM을 추가합니다 :

    순위에 ROWNUM을 추가합니다 :

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

    4.SQL 서버에서이 테스트를 (그리고 서브 쿼리를 사용)

    SQL 서버에서이 테스트를 (그리고 서브 쿼리를 사용)

    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)
    

    당신의 요구에 맞게 하위 쿼리에 의해 주문을 할

  5. ==============================

    5.나는 이것이 매우 효율적입니다 물론 이죠,하지만 어쩌면 출발점 아니에요?

    나는 이것이 매우 효율적입니다 물론 이죠,하지만 어쩌면 출발점 아니에요?

    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 명 별개의 직원이 포함 된 행을 제공해야합니다. 불행하게도, 그것은 당신에게 사람들의 모든 조합을 제공 할 것입니다.

    아래 캔 누구 파레이 좀?

  6. from https://stackoverflow.com/questions/134958/get-top-results-for-each-group-in-oracle by cc-by-sa and MIT license