[SQL] (오라클) 각 그룹에 대해 최고 결과를 얻을 수 있습니다
SQL(오라클) 각 그룹에 대해 최고 결과를 얻을 수 있습니다
나는 여러 그룹에 대한 N 결과를 얻을 수있을 것입니다 방법 오라클 쿼리.
예를 들어, 주어진 다음의 표 :
|--------+------------+------------|
| emp_id | name | occupation |
|--------+------------+------------|
| 1 | John Smith | Accountant |
| 2 | Jane Doe | Engineer |
| 3 | Jack Black | Funnyman |
|--------+------------+------------|
더 직업에 더 많은 행이 있습니다. 나는 좀하고 싶습니다 3 명의 직원은 각 직업에서 (말할 수).
하위 쿼리를 사용하지 않고이 작업을 수행 할 수있는 방법이 있나요?
해결법
-
==============================
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.나는이 테스트를하지 않은, 그래서 지금은 오라클 인스턴스 편리 권한이 없습니다 :
나는이 테스트를하지 않은, 그래서 지금은 오라클 인스턴스 편리 권한이 없습니다 :
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.순위에 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.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.나는 이것이 매우 효율적입니다 물론 이죠,하지만 어쩌면 출발점 아니에요?
나는 이것이 매우 효율적입니다 물론 이죠,하지만 어쩌면 출발점 아니에요?
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 명 별개의 직원이 포함 된 행을 제공해야합니다. 불행하게도, 그것은 당신에게 사람들의 모든 조합을 제공 할 것입니다.
아래 캔 누구 파레이 좀?
from https://stackoverflow.com/questions/134958/get-top-results-for-each-group-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 플러스에서 실행하는 SQL 스크립트에서 앰퍼샌드를 무시합니까? (0) | 2020.03.19 |
---|---|
[SQL] 데이터베이스 나 시스템 파일에서 이미지를 저장? [닫은] (0) | 2020.03.19 |
[SQL] WHERE COL IN (...) 조건에 대한 제한 (0) | 2020.03.19 |
[SQL] MySQL의 함수는 두 날짜 사이의 작업 일 수를 찾을 수 (0) | 2020.03.19 |
[SQL] 한 쿼리에서 두 테이블에서 삭제 (0) | 2020.03.18 |